使用CUDA中的循环访问float4/int4元素

Azr*_*000 2 cuda

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

float *vec;
vec = new float[4];
for(int i=0; i<4; i++) vec[i] = ...;
Run Code Online (Sandbox Code Playgroud)

现在使用float4,我所能做的就是为每个.x,.y,.z,.w写一行,我觉得有点讨厌.有没有办法以类似的方式访问float4元素,即

float4 vec;
for(int i=0; i<4; i++) vec[i] = ...;
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

Pau*_*l R 5

你可以使用联盟,例如

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

U4 u;

for (int i = 0; i < 4; ++i) u.a[i] = ...;
Run Code Online (Sandbox Code Playgroud)

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

注意:从技术上讲,写入联合的一个变体然后从另一个变量读取是UB,但在这种情况下它应该正常工作,您不需要担心可移植性,因为这是特定于CUDA的.