Cuda: используйте глобальную память для хранения непрерывных данных различного размера - PullRequest
1 голос
/ 10 марта 2012

У меня проблема с использованием буфера байтов в глобальной памяти для хранения некоторого целого числа различного размера (8 бит, 16 бит, 32 бита, 64 бита).

Если я храню целое число со значением указателя, не кратным 4 байтам (например, потому что я только что сохранил 8-битное целое число), адрес округляется в меньшую сторону, стирая предыдущие данные.

__global__ void kernel(char* pointer)
{
    *(int*)(pointer+3)=3300000;
}

В этом примере кода с использованием любого из: (указатель), (указатель + 1), (указатель + 2), (указатель + 3) целое число сохраняется в (указатель), учитывая, что указатель кратен 4.

Организована ли память cuda в 32-битных блоках на аппаратном уровне? Есть ли способ сделать эту работу?

1 Ответ

1 голос
/ 11 марта 2012

Выравнивание размера слова не подлежит обсуждению в CUDA.Однако, если вы по какой-то причине хотите снизить производительность, вы можете упаковать свои данные в char *, а затем просто написать свою собственную функцию хранения, например

__inline __device__ void Assign(int val, char * arr, int len)
{
   for (int idx = 0; idx < len; idx++)
      *(arr+idx)=(val & (0xFF<<(idx<<8))
}

__inline __device__ int Get(char * arr, int idx, int len)
{
   int val;
   for (int idx = 0; idx < len; idx++)
      val=(int)(*arr[idx+len*idx]<<(idx<<8)));
   return val;
}

Надеюсь, что это поможет!*

...