请问,在CUDA中,如何将一个共享内存中的数组初始化为0?除了循环赋值以外,有没有一个比较快的方法?
比如:
global viod kernel( )
{
shared double aa[12830]; // 128是每个block中的线程数
// shared double aa[12830]={0}; 直接像C语言那样,编译时会出错:initializer not allowed for shared variable
}
请问,在CUDA中,如何将一个共享内存中的数组初始化为0?除了循环赋值以外,有没有一个比较快的方法?
比如:
global viod kernel( )
{
shared double aa[12830]; // 128是每个block中的线程数
// shared double aa[12830]={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即可。
祝您好运~
您好:
仅推荐这一种方法。
祝您好运~
嗯,明白了,版主,谢谢您!
不客气的,欢迎您常来论坛~
祝您编码顺利~