cudnnSoftmaxForwardの特定のフロート値セットを使用すると、CUDNN_SOFTMAX_ACCURATEの代わりにCUDNN_SOFTMAX_FASTを使用するとNaN出力が生成されます。誰がなぜこれが起こっているのか知っていますか?これは図書館のバグですか?ここでcudnn:CUDNN_SOFTMAX_ACCURATEが正常に動作したときにNaNを出力するCUDNN_SOFTMAX_FAST
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]);
}
CUDNN_SOFTMAX_FASTを使用して結果されています
ここではCUDNN_SOFTMAX_ACCURATEを使用した結果は以下のとおりです。