0

Verwendung bestimmter Sätze von Gleitkommawerten für cudnnSoftmaxForward erzeugt NaN ausgibt, wenn die Einstellung CUDNN_SOFTMAX_FAST anstelle von CUDNN_SOFTMAX_ACCURATE verwendet wird. Weiß jemand, warum das passiert? Ist das ein Fehler in der Bibliothek?cudnn: CUDNN_SOFTMAX_FAST ouputing NaN wenn CUDNN_SOFTMAX_ACCURATE Funktionsweise feinen

cudnnHandle_t lib; 
cudnnCreate(&lib); 
int count = 10; 
size_t size = count * sizeof(float); 

float examples[] = { 
    95.094505f, 
    -600.288879f, 
    85.621284f, 
    72.220154f, 
    70.099487f, 
    43.734470f, 
    69.538422f, 
    69.705490f, 
    20.752966f, 
    81.020088f 
}; 

float* cexamples; 
cudaMalloc(&cexamples, size); 
cudaMemcpy(cexamples, examples, size, cudaMemcpyKind::cudaMemcpyHostToDevice); 

cudnnTensorDescriptor_t tExamples; 
cudnnCreateTensorDescriptor(&tExamples); 
cudnnSetTensor4dDescriptor(tExamples, cudnnTensorFormat_t::CUDNN_TENSOR_NCHW, cudnnDataType_t::CUDNN_DATA_FLOAT, 1, count, 1, 1); 

float one = 1; 
float zero = 0; 

cudnnSoftmaxForward(lib, cudnnSoftmaxAlgorithm_t::CUDNN_SOFTMAX_FAST, cudnnSoftmaxMode_t::CUDNN_SOFTMAX_MODE_INSTANCE, &one, tExamples, cexamples, &zero, tExamples, cexamples); 

cudaMemcpy(examples, cexamples, size, cudaMemcpyKind::cudaMemcpyDeviceToHost); 
for (size_t i = 0; i < count; i++) 
{ 
    printf("\n"); 
    printf("%f ", examples[i]); 
} 

Hier sind die Ergebnisse CUDNN_SOFTMAX_FAST mit:

enter image description here

Hier sind die Ergebnisse mit CUDNN_SOFTMAX_ACCURATE:

enter image description here

Antwort

1

Ich denke, dass Ihr Problem durch Überlauf dh Sie verursacht wird (irgendwo im Prozess) einen Wert haben, der zu groß wird, um einzu sein.

CUDNN_SOFTMAX_FAST einfach ausführen, ohne zu prüfen, ob ein Überlauf aufgetreten ist oder nicht. Auf der anderen Seite CUDNN_SOFTMAX_ACCURATE vermeidet es (mit Subtraktion).

CUDNN NaN zurück auf Überlauf (beachten Sie, dass 'standart' C würde wahrscheinlich nicht so verhalten)

Was könnte ich vorschlagen: (warum nicht normalization mit)

  • Verwenden kleinere Werte
  • Versuchen sie größere Arten zu verwenden (sieht naiv, aber vielleicht wäre es in Ordnung sein)
  • Stellen sie einfach CUDNN_SOFTMAX_ACCURATE

hoffe, das hilft

pltrdy

Verwandte Themen