请教一个弱弱的问题

请问在kernel里面,一个数组和shared mem有什么区别?例如

global void Kernel()
{
int a[16];
shared int b[16];

}

b是block内所有thread可见,那么a呢?和b一样吗?谢谢!

LZ您好,shared memory是一个block内可见的,如您代码中,整个block只申请了一个b[16],但是每个线程都可以访问这个数组。

而您代码中的a[16]则是每个线程私有的数组,您有多少个线程,就开辟了多少个a[16],每个线程只能访问自己的a[16],不同线程的a[16]虽然看上去名字一样,但却是每个线程独立私有的,内容也可以不同。

另外,捎带说一下,kernel内的数组(如上文中的a)可能会被放置到较慢的local memory中,您可以在跑profiler的时候看看local memory的使用情况。

大致如上,祝您编码愉快~

local mem是在device上面哈?

是的,但是global memory,shared memory都是device(GPU卡)上的资源。

其不同之处在于,global memory和local memory是显存的存储空间;而shared memory则是GPU芯片上的高速存储器(用作手工控制的cache)。

按照线程视角,global memory是所有线程可见的,shared memory是一个block内部线程可见的,local memory是一个线程私有的。

一个线程私有的还有寄存器资源等。

顺便再补充ICE大一句,您的a, 在一般情况下,是在local memory的。有的情况下(例如对下标访问完全可以在编译时刻确定),那么可能在寄存器里。

谢谢二位详细的解释~

楼主身披甲胄,口有利牙,莅临本坛,蓬荜生辉。

服务您是我们的荣幸!


+12580!(顺便编辑到这里吧,就不另开楼了。)