我正在使用CUDA 5.5并且我发现编译器行为有点奇怪,如果我尝试寻址只有数据是4个无符号字符的结构,它会触发4次加载u8.相反,如果我使用union并加载uchar4,它会产生所需的nc.v4.u8加载
此代码生成ld.global.u8%rs5,[%r32];
const int wu = 4;
struct data {
uchar_t v[wu];
CUDA_CALLABLE_MEMBER uchar_t &operator[] (int i) {
return v[i];
}
} fetch[rows];
for (int i = 0; i < rows; i++) {
fetch[i] = *((data*)&src[offsetSrc + i*strideSrc]);
}
Run Code Online (Sandbox Code Playgroud)
所以我必须解决这个问题,建立一个产生所需要的联盟:ld.global.nc.v4.u8 {%rs49,%rs50,%rs51,%rs52},[%r37];
const int wu = 4;
struct data {
union {
uchar_t v[wu];
uchar4 v4;
};
CUDA_CALLABLE_MEMBER uchar_t &operator[] (int i) {
return v[i];
}
} fetch[rows];
for (int i = 0; i < rows; i++) {
fetch[i].v4 = *((uchar4*)&src[offsetSrc + i*strideSrc]);
}
Run Code Online (Sandbox Code Playgroud)