共享内存

请问,在CUDA中,如何将一个共享内存中的数组初始化为0?除了循环赋值以外,有没有一个比较快的方法?
比如:

global viod kernel( )
{
shared double aa[12830]; // 128是每个block中的线程数
// shared double aa[128
30]={0}; 直接像C语言那样,编译时会出错:initializer not allowed for shared variable
}

LZ您好:

你可以使用多个线程对shared memory进行清零。

例如:

global void kernel()

{
shared double aa[128];
int tid=threadIdx.x;
if(tid<128)
{ aa[tid]=0;}

__syncthreads(); //同步后,shared memory就可以安全使用了。

}

大致这样即可,上述情况下tid要不小于127(即block x维度元素数不小于128个),您可以根据情况调整写法。

祝您好运~

斑竹,我现在也是用你说的这种方式进行初始化,除了这种方式,斑竹还有其他的推荐嘛?想多学习一下!

嗯,谢谢版主,这倒是个好办法!
那么,如果一个线程对应着多个位置的话,比如aa[128*30]还是需要循环吧?

LZ您好:

可以循环实现的,您可以写成:

if(tid<128)
{
for(int i=0;i<30;++i)
{
aa[tid+i*128]=0;
}
}
__syncthreads();

这并不影响效能,以及写法不唯一,您只要注意避免bank conflict即可。

祝您好运~

您好:

仅推荐这一种方法。

祝您好运~

嗯,明白了,版主,谢谢您!:slight_smile:

不客气的,欢迎您常来论坛~

祝您编码顺利~