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;