cuda中atomicAdd效率问题

atomicAdd遇到冲突是开销会比较大,最好先用共享变量先累加一部分,然后再把共享变量加到全局变量,减少冲突。



{

int j = blockIdx.x;
int i = blockIdx.y;
    int k2=i*gridDim.x;


int f=threadIdx.x;     //0~5
int k = threadIdx.y;  //0~31
atomicAdd(dst+k2+j+gridDim.x*gridDim.y*f,src[k*gridDim.x*gridDim.y+k2+j]*matrix[k+f*size0]);

}

可以进行以下优化

{


int j = blockIdx.x;
int i = blockIdx.y;
            int k2=i*gridDim.x;

int f=threadIdx.x;     //0~5
int k = threadIdx.y;  //0~31

__shared__ float dstTmp[6];
dstTmp[f] = dstTmp[f] = 0;        
__syncthreads();


atomicAdd((float *)&dstTmp[f], src[k*gridDim.x*gridDim.y+k2+j]*matrix[k+f*size0]);
__syncthreads();


if (k==0)
{
atomicAdd(dst+k2+j+gridDim.x*gridDim.y*f,dstTmp[f]);
}

}

效率能提高一倍以上,当然还有很大的优化空间,继续研究

你可能感兴趣的:(cuda中atomicAdd效率问题)