我只是在编写第一个CUDA程序,实际上是对C++代码的重写。现在,它处理了很多 vector 数学运算,因此我使用的float4数据类型提供了我所需要的。但是,旧代码包含很多

float *vec;
vec = new float[4];
for(int i=0; i<4; i++) vec[i] = ...;

现在,使用float4我所能做的就是为每个.x,.y,.z,.w写一行,这让我有点烦。没有办法以类似的方式访问float4元素,即
float4 vec;
for(int i=0; i<4; i++) vec[i] = ...;

不幸的是,我在互联网上找不到任何提示。

提前致谢。

最佳答案

您可以使用工会,例如

typedef union {
    float4 vec;
    float a[4];
} U4;

U4 u;

for (int i = 0; i < 4; ++i) u.a[i] = ...;

对于float4数组,只需将基础类型更改为U4

注意:从技术上讲,它是UB,它先写入并集的一个变体,然后从另一个变体中读取,但是在这种情况下,它应该可以正常工作,并且您不必担心可移植性,因为这是CUDA特定的。

10-06 12:50