请问在kernel里面,一个数组和shared mem有什么区别?例如
global void Kernel()
{
int a[16];
shared int b[16];
…
}
b是block内所有thread可见,那么a呢?和b一样吗?谢谢!
请问在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!(顺便编辑到这里吧,就不另开楼了。)