我的CUDA代码中有一个内核,我想要一堆线程在一些共享内存上做一堆计算(因为它比在全局内存上执行快得多),然后将结果写入全局内存(所以我可以在以后的内核中使用它)。内核看起来像这样:
__global__ void calc(float * globalmem)
{
__shared__ float sharemem; //initialize shared memory
sharemem = 0; //set it to initial value
__syncthreads();
//do various calculations on the shared memory
//for example I use atomicAdd() to add each thread's
//result to sharedmem...
__syncthreads();
*globalmem = sharedmem;//write shared memory to global memory
}
每个线程都将数据从共享内存写入全局内存这一事实,当我真的只需要写出一次时,对我来说感觉很可疑。我也从每个线程在代码开始时将共享内存初始化为零的事实中得到同样的感觉。有没有比我目前的实现更快的方法呢?
答案 0 :(得分:1)
在warp级别,执行冗余读取或写入与使用单个线程执行操作之间可能没有太大的性能差异。
但是,我希望通过在线程块中使用多个warp进行冗余读取或写入(相对于单个线程),可能会产生可测量的性能差异。
通过让单个线程执行读取或写入而不是冗余来解决这些问题应该足够了:
__global__ void calc(float * globalmem)
{
__shared__ float sharemem; //initialize shared memory
if (!threadIdx.x) sharemem = 0; //set it to initial value
__syncthreads();
//do various calculations on the shared memory
//for example I use atomicAdd() to add each thread's
//result to sharedmem...
__syncthreads();
if (!threadIdx.x) *globalmem = sharemem;//write shared memory to global memory
}
虽然你没有问过它,但是在共享内存的线程块中使用原子可能是可以通过共享内存减少方法替换(可能更好的性能)。