Я использую CUDA 5.5, и я нахожу, что поведение компилятора немного странно, если я пытаюсь обратиться к структуре, которая содержит только 4 символа без знака, он запускает четыре загрузки u8. Вместо этого, если использовать объединение и загрузить uchar4 он производит требуемую нагрузку nc.v4.u8Почему статический объявленный массив из 4 неподписанных символов генерирует ld.global.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]);
}
Так что я должен адресовать его положить союз для получения желаемого: 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]);
}
и что это вопрос? – RoBiK
вопрос заключается в том, что я не понял, почему компилятор создает единую нагрузку в явно идентичной структуре ... Я думал, что компилятор достаточно умен, чтобы знать, что моя структура выровнена (или может быть выровнена). Но я вижу, что проблема исходила из косвенности (data *) vs (uchar4 *). Если указатель «src» был указателем на выровненный тип/структуру 4 байта (например, int *), с исходной структурой, должен ли компилятор создать один 32-битный или четыре 8b-загрузки? – Dredok
Вопрос в названии. И отличный вопрос. +1 – harrism