1

次のコードではエラーが発生し、その理由がわかりません。誰かが私が間違っていることを教えてもらえますか。

__global__ void thekernel(float *device_a, int CELLS, int LVLS) {

   int t_id = threadIdx.x + blockDim.x * blockIdx.x;

   int INR = CELLS - 1;
   int col = INR - (threadIdx.x % CELLS);
   int row = t_id / CELLS;
   float power = (row / pow((float)LVLS, col)) % LVLS;
   device_a[t_id] = power;
 }

コンパイルエラーは次のように述べています:

cudaMain.cu(11): error: expression must have integral or enum type

これは式です:

float power = (row / pow((float)LVLS, col)) % LVLS;

この式から"% LVLS"を削除すると、コードはエラーなしでコンパイルされます。コンパイル文字列は次のとおりです。

nvcc -G -g -O0 -gencode arch=compute_20,code=sm_20 -odir "" -M -o "cudaMain.d" "../cudaMain.cu"
nvcc --compile -G -O0 -g -gencode arch=compute_20,code=compute_20 -gencode arch=compute_20,code=sm_20  -x cu -o  "cudaMain.o" "../cudaMain.cu"

ハードウェア

私の GPU カードは次のとおりです。コンピューティング機能 2.0 を備えた Quadro 6000

4

1 に答える 1

1

累乗関数をint型にキャストするとうまくいきました。

int denom = (int)pow((float)LVLS, (float)col);
int power = (row / denom) % LVLS;

コンパイル エラーなしで実行されました。興味深いことに、cuda では、剰余演算子は整数に制限されています。(これについてはよくわかりません)

于 2013-06-02T21:52:51.080 に答える