CUDA5.0を使用しています。コンパイラーを使用すると、カーネル内でホスト宣言されたint定数を使用できるようになることに気付きました。ただし、ホストで宣言されたfloat定数を使用するカーネルのコンパイルは拒否されます。この一見矛盾の理由を誰かが知っていますか?
たとえば、次のコードはそのままで問題なく実行されますが、カーネルの最後の行がコメント化されていない場合はコンパイルされません。
#include <cstdio>
#include <cuda_runtime.h>
static int __constant__ DEV_INT_CONSTANT = 1;
static float __constant__ DEV_FLOAT_CONSTANT = 2.0f;
static int const HST_INT_CONSTANT = 3;
static float const HST_FLOAT_CONSTANT = 4.0f;
__global__ void uselessKernel(float * val)
{
*val = 0.0f;
// Use device int and float constants
*val += DEV_INT_CONSTANT;
*val += DEV_FLOAT_CONSTANT;
// Use host int and float constants
*val += HST_INT_CONSTANT;
//*val += HST_FLOAT_CONSTANT; // won't compile if uncommented
}
int main(void)
{
float * d_val;
cudaMalloc((void **)&d_val, sizeof(float));
uselessKernel<<<1, 1>>>(d_val);
cudaFree(d_val);
}