2014-02-14 2 views
1

Я пишу код ядра CUDA, который использует разделяемую память, но имеет проблемы с объявлением переменных общей памяти.Невозможно выделить общую память CUDA

Это происходит, когда я пытаюсь распределить несколько разделяемой памяти статически следующим образом.

__global__ 
void kernel_func(float *global_matrix) { 
    __shared__ float sm_mat1[4][4]; 
    __shared__ float sm_mat2[6][6]; 
    __shared__ float sm_mat3[3][3][3]; 

    if (blockIdx.x==0 && blockIdx.y==0 && theradIdx.x==0 && threadIdx.y==0) 
     printf("sizeof(sm_mat1)=%d, sizeof(sm_mat2)=%d, sizeof(sm_mat3)=%d.\n", 
        sizeof(sm_mat1), sizeof(sm_mat2), sizeof(sm_mat3)); 

    ... 
} 

Однако, когда я выполняю, он выводит странное сообщение следующим образом. sizeof (sm_mat1) = 64, sizeof (sm_mat2) = 0, sizeof (sm_mat3) = 128

Кажется, что вторая матрица не выделена, а 3-я матрица выделена как 2-й. Фактически, доступ к второй матрице работает неправильно. (не может читать/записывать данные).

Я использую GTX 480 и cuda2.0. (Я печатаю сообщение, используя параметр компиляции -arch = sm_20).

У вас есть мысли?

ответ

5

Оператор sizeof не возвращается int но std::size_t. Итак, когда вы отправляете свой результат на печать в системах, где sizeof(size_t) == 8 и sizeof(int) == 4, и попытайтесь распечатать их с %d, один результат из sizeof будет разделен на две половины, которые будут напечатаны последовательными %d спецификаторами. Ноль, помещенный вместо второго спецификатора, является верхней половиной первого результата оператора sizeof.

Чтобы исправить выходное значение, вы можете явно нанести sizeof результат на int или попробовать %ld или %lld спецификаторы.

Но я также не могу воспроизвести ошибку с неправильным размером второй матрицы.

+0

Хорошая точка. Это правильный ответ. Ошибка выполняется только на 64-битных платформах, так как 'sizeof (size_t)' is '8' и интерпретируется как 2 отдельных значения int спецификатором формата'% d'. – sgarizvi

Смежные вопросы