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

3
在if语句中targets的两个赋值处会抛出以下错误。
error: expression must have integral or enum type

操作中的所有变量都是浮点值或返回浮点值,因为它们被声明为这样。 但是它不喜欢转换为整数。 为什么会这样? 不同类型的浮点数或整数之间有差异吗?

__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
   }
}
1个回答

5
targets[i + MAX_TARGETS*0]targets[i + MAX_TARGETS*1] 中,你使用了一个 i,这个 i 是一个 float 类型。这导致了整个计算数组下标的表达式也成为了一个 float 类型。然而,这是不允许的,因为数组下标必须是整数类型(不存在第4.5个元素)。
如果你想保持 ifloat 类型,你需要把它转换为整数类型来进行数组下标操作,或者将表达式的结果转换为整数类型。

我明白了,哪种方式最好呢?在右侧使用时将其声明为int并转换为float,还是将其声明为float并转换为整数?哪种转换速度最快? - Johan Sundman
2
@JohanSundman 由于angleStep是一个float,你可以将i设为int,它会自动转换为float。这可能是最快和最简单的解决方案。 - NathanOliver
@JohanSundman blockIdx是什么,blockIdx.x中的x是什么类型? - NathanOliver
@BenjaminBarrois blockIdx.x 是一个整数,至少我认为它没有任何小数部分。所以答案很好。谢谢你的关心。 - Johan Sundman
1
如果它是一个整数,就没问题!实际上你只需要将float i = blockIdx.x; 替换为 int i = blockIdx.x;,这样你就只需要进行一次类型转换(整数/浮点数之间的转换是昂贵的)。 - Benjamin Barrois
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接