Compiler construction CUDA 5.0,编译错误

Compiler construction CUDA 5.0,编译错误,compiler-construction,cuda,compiler-errors,Compiler Construction,Cuda,Compiler Errors,下面的代码给出了一个错误,我看不出任何原因。有人能告诉我我做错了什么吗 __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;

下面的代码给出了一个错误,我看不出任何原因。有人能告诉我我做错了什么吗

__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卡是:Quadro 6000,计算能力为2.0

将幂函数转换为键入int

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

执行时没有任何编译错误。有趣的是,在cuda中,模运算符仅限于整数。(我对此不太确定)

将幂函数转换为键入int有效

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

执行时没有任何编译错误。有趣的是,在cuda中,模运算符仅限于整数。(我对此不太确定)

浮点pow(float,int)还没有完成,也许?你能试试pow(float,float)或pow(int,int)@huseyintugrulbuyukisik吗?如果我只是删除mod LVLS或(%LVLS),错误就会消失。如果我将语句分成两行:power=(row/pow((float)LVLS,col))power=power%LVLS,那么在第二行(power=power%LVLS)会再次出现错误,您可能需要取整数类型的模,例如int或long。可能浮点和双精度不能用于模数运算符目标。它应该自动施放,虽然它不需要。是的,你是对的。将pow((浮动)LVLS,col)转换为整数的效果正常。但这很有趣。有些事情出乎我的意料。可能是因为它必须遵守C-99?浮点pow(浮点,int)还没有完成,也许?你能试试pow(float,float)或pow(int,int)@huseyintugrulbuyukisik吗?如果我只是删除mod LVLS或(%LVLS),错误就会消失。如果我将语句分成两行:power=(row/pow((float)LVLS,col))power=power%LVLS,那么在第二行(power=power%LVLS)会再次出现错误,您可能需要取整数类型的模,例如int或long。可能浮点和双精度不能用于模数运算符目标。它应该自动施放,虽然它不需要。是的,你是对的。将pow((浮动)LVLS,col)转换为整数的效果正常。但这很有趣。也许是因为它必须遵守C-99,而不是在CUDA中,它是C和C++标准的一部分,代码< %%/COD> >运算符只适用于整数类型。从数学上讲,余数是整数除法的一部分,而不是十进制除法。有关功能类似于模运算符但为浮点操作数定义的内容,请查看函数fmod()、rements()和remquo()。注意:这些在我使用的任何平台上都不是特别快,包括CUDA。不是CUDA,它是C和C++标准的一部分,代码> %运算符只适用于整数类型。从数学上讲,余数是整数除法的一部分,而不是十进制除法。有关功能类似于模运算符但为浮点操作数定义的内容,请查看函数fmod()、rements()和remquo()。注意:在我使用过的任何平台(包括CUDA)上,这些都不是特别快。