从CUDA内核编译引用int
常量并正常工作,但引用float
常量会产生编译错误。
以下是使用CUDA 6.5在Windows 7 x64上使用Visual Studio 2013编译的最小代码:
#include "cuda_runtime.h"
#include <stdio.h>
const int foo = 42;
const float bar = 42.0f;
__global__ void kernel(void)
{
printf("foo = %d\n", foo); // OK
printf("bar = %f\n", bar); // error : identifier "bar" is undefined in device code
}
int main()
{
kernel <<<1, 1 >>>();
cudaDeviceSynchronize();
return 0;
}
编译器输出:
error : identifier "bar" is undefined in device code
注意:如果第二行printf
行被注释掉,代码将编译并生成42
的预期输出。为清楚起见,跳过了运行时错误检查,因为这个问题与编译时错误有关。
我知道我可以使用CUDA __constant__
内存来实现类似的目标,但我仍然想了解导致此情景中int
和float
之间存在差异的原因,以及是否存在是一种使用float
常量可编译来生成内核代码的方法。