2016-11-18 4 views
2

Возможно ли увидеть адрес глобальной памяти, к которому обращается поток во время выполнения?CUDA: адрес доступа к глобальной памяти

Я знаю, что это создаст много накладных расходов, но я хотел бы посмотреть, к каким элементам обращаются. Я думаю, это поможет мне понять, как реализуется механизм коалесценции.

спасибо.

ответ

1

Код потока CUDA в значительной степени соответствует шаблонам синтаксиса C и C++. Таким образом, вы можете легко распечатать числовое значение указателя в коде ядра:

printf("pval = %p\n", my_pointer); 

Если вы хотите, чтобы сделать это через потоки в ядре CUDA, вы можете сделать:

__global__ void my_kernel(int *data){ 
    int idx = threadIdx.x+blockDim.x*blockIdx.x; 
    printf("thread: %d, pointer: %p, value: %d\n", idx, &(data[idx]), data[idx]); 
} 

или аналогичный. Очевидно, что это создаст большой объем вывода, если вы используете большое количество потоков, и имейте в виду, что в ядре printf используется буфер ограниченного размера.

+0

Спасибо. Может быть, я могу просто сделать некоторую простую арифметику указателя, чтобы увидеть, когда доступ «не» объединен (например, без отдельных шагов и некоторые из них), и просто распечатайте это. – algoProg

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