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

时间:2012-01-28 09:15:11

标签: cuda

我只是编写我的第一个CUDA程序,它实际上是对C ++代码的重写。现在它处理了很多矢量数学,所以我使用了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] = ...;

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

提前致谢。

2 个答案:

答案 0 :(得分:5)

您可以使用联合,例如

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

U4 u;

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

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

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

答案 1 :(得分:2)

可能不安全,但这是最简单的方法。

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

或者你可以翻转这个

float4 vec4;
float *vec = (float *)&vec4; // Do not free this pointer
for(int i=0; i<4; i++) vec[i] = ...;

修改 直接存储到数组中的唯一方法就是这样

float4 vec4 = {val[0], val[1], val[2], val[3]};

所以如果你有一个float4s数组,你可以像下面这样做

float4 *vec4 = new float4[10];
float *vec = new float[4];
for(int i = 0; i < 10; i++) {
for(int j = 0; j < 4; j++) vec[j] = j;
vec4[i] = (float4){vec[0], vec[1], vec[2], vec[3]}
}

除此之外,我无法想象一个更简单的方法。