我只是在编写第一个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特定的。