Cuda、设备、表达式必须具有整数或枚举类型

Joh*_*man 3 c++ cuda casting

targetsif 语句中的两个赋值会引发以下错误。

error: expression must have integral or enum type
Run Code Online (Sandbox Code Playgroud)

操作中的所有变量都是或返回浮点值,正如它们所声明的那样。但它不喜欢转换为整数。为什么是这样?不同种类的浮点数或整数之间有区别吗?

__global__
void generateTargets(int* targets, int targetAmount, float radius, float angleStep){
   float i = blockIdx.x;
   if(i < targetAmount){ // Ensure it stays in range
       // Access the 1d array representation of the 2d array [MAX_TARGETS][2]
       targets[i + MAX_TARGETS*0] = __float2int_rd(radius*__cosf(i*angleStep)); // X value
       targets[i + MAX_TARGETS*1] = __float2int_rd(radius*__sinf(i*angleStep)); // Y value
   }
}
Run Code Online (Sandbox Code Playgroud)

Nat*_*ica 5

targets[i + MAX_TARGETS*0]并且targets[i + MAX_TARGETS*1]您正在使用的ifloat. 这使得整个表达式计算数组索引 a float。但你不能这样做,因为数组索引必须是整数类型(没有元素 4.5)。

如果您想保留ia,float则需要将其转换/转换为“整数类型”或将表达式的结果转换/转换为整数类型。

  • @JohanSundman 因为`angleStep`是一个`float`,你可以将`i`设置为`int`,它会自动为你转换为浮点数。这可能是最快、最简单的解决方案。 (2认同)