c++ - Cuda, device, expression 必须有整型或枚举类型

标签 c++ casting cuda

在if语句中对targets的两次赋值会抛出如下错误

error: expression must have integral or enum type

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

__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
   }
}

最佳答案

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

如果你想保持 ifloat,你需要将它强制转换/转换为 `integer 类型,或者将表达式的结果强制转换/转换为整数类型。

关于c++ - Cuda, device, expression 必须有整型或枚举类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51479660/

相关文章:

c++ - 从 Visual Studio 切换到 GNU 构建系统。需要一般建议

c++ - 多个文件,相同的命名空间

c++ - 使用 CMAKE 编译 CUDA C++ - 指定了多个编译阶段

caching - 如何避免 CUDA GPU 中的 TLB 未命中(以及高全局内存重放开销)?

eclipse - 如何使用 eclipse Nsight 仅使用一个 GPU 调试 CUDA

c++ - "invalid use of non-static data member"当通过友善的输出运算符访问模板化类的字段时

c++ - C++ 标准库中名为 "base"和 "basic"的类的约定是什么?

c# - C#中的自动类型转换

ios - 将 UnsafeMutablePointer 转换为 UnsafeMutableRawPointer

c# - 对于引用类型,使用 IEquatable<T> 如何减少强制转换的使用?