2016-11-18 142 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