Как указать выравнивание для глобальных переменных устройства в CUDA

Я хотел бы объявить выравнивание для глобальной переменной устройства в CUDA. В частности, у меня есть строковое объявление, например __device__ char str1 = "some pre-defined string"; В обычном gcc я могу запросить выравнивание у компилятора как __device__ char str1 __attribute__ ((aligned (4))) = "some pre-defined string";

Однако, когда я попробовал это на nvcc, компилятор игнорирует эти запросы. Причина, по которой я хотел бы сделать это, состоит в том, чтобы скопировать эти строки в буфер в моих ядрах, а копирование слов за раз намного быстрее, чем копирование байтов за раз, хотя они требуют, чтобы строка src была выровнена. Может ли кто-нибудь сказать мне, как запросить выравнивание у компилятора nvcc?


person fall3nm0nk    schedule 03.11.2012    source источник


Ответы (2)


См. раздел 5.3.2 «Требования к размеру и выравниванию» «Руководства по программированию CUDA C», которое можно найти здесь:

Требование выравнивания автоматически выполняется для встроенных типов char, short, int, long, longlong, float, double, таких как float2 или float4.

Для структур требования к размеру и выравниванию могут быть установлены компилятором с помощью спецификаторов выравнивания __align__(8) или __align__(16).

Пример использования:

struct __align__(8) { 
    float r; 
    float i;
} complex_num;
person njuffa    schedule 03.11.2012
comment
Спасибо. Это работает. Я проверил руководство по компилятору NVCC в поисках чего-то упомянутого там. Я также должен был проверить руководство по программированию на C. - person fall3nm0nk; 03.11.2012

Вы можете проверить, работает ли это?

__device__ char __align__(4) str1 = "some pre-defined string";
person Roger Dahl    schedule 03.11.2012
comment
Спасибо за быстрый ответ. Это был мой первый раз, когда я обращался за помощью к StackOverflow, и я обязательно буду использовать его в качестве ресурса в будущем. - person fall3nm0nk; 03.11.2012