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



我刚刚写我的第一个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] = ...;

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

提前谢谢。

您可以使用联合,例如

typedef union {
    float4 vec;
    float a[4];
} U4;
U4 u;
for (int i = 0; i < 4; ++i) u.a[i] = ...;

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

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

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

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]};

因此,如果你有一个float4数组,你可以做一些事情,比如下面的

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

除此之外,我想不出更简单的方法。

最新更新