Parallel processing 减少共享内存库冲突

Parallel processing 减少共享内存库冲突,parallel-processing,cuda,nvidia,Parallel Processing,Cuda,Nvidia,Nvprof报告说,在我的sgemm内核中,大约有2亿个共享银行冲突和一些共享银行冲突。我尝试了填充技巧\uuuuuuuuuuuuuuuuuuuuu共享\uuuuuuuuuuuuuuuuuuuuuuuuuuu浮点smem[大小+偏移],它将存储库冲突减少到0,但仍存在加载库冲突。我不知道如何进一步改进它 \uuuu全局\uuuuuu无效sgemm( 常量浮点*限制, 常量浮点*\uuuu限制\uuuub, 浮动*限制, int M,int N,int K ){ int tid=threadIdx

Nvprof报告说,在我的sgemm内核中,大约有2亿个共享银行冲突和一些共享银行冲突。我尝试了填充技巧
\uuuuuuuuuuuuuuuuuuuuu共享\uuuuuuuuuuuuuuuuuuuuuuuuuuu浮点smem[大小+偏移],它将存储库冲突减少到0,但仍存在加载库冲突。我不知道如何进一步改进它

\uuuu全局\uuuuuu无效sgemm(
常量浮点*限制,
常量浮点*\uuuu限制\uuuub,
浮动*限制,
int M,int N,int K
){
int tid=threadIdx.x;
int gStartx=blockIdx.x*128;
int gStarty=blockIdx.y*128;
int dx=tid%8;
int-dy=tid/8;
intvx=tid%16;
int-vy=三次工业总产值/16;
__共享浮动aSM[8][128+4];
__共享浮动bSM[8][128+4];
浮动轴承1[4];
浮动bBuffer1[4];
浮动轴承2[4];
浮动bBuffer2[4];
浮动cCache[8][8];
#布拉格展开

对于(int i=0;iOk),我找到了一个解决方案:当存储到bSM时,在第二个维度的每32个字之间插入一个填充字

//bSM[dx][dy+i*32]=bBuffer1[i];
bSM[dx][dy+i*33]=bBuffer1[i];//跳过第32、65、98、131列
阅读
bSM[i][j]
时,请这样读:
bSM[i][j/32+j]

//浮点b=bSM[ki][8*vx+ni];
浮点数b=bSM[ki][(8*vx)/32+8*vx+ni];
//(8*vx+ni)/32与(8*vx)/32相同,因为vi始终小于8

现在它给了我特斯拉p4上cublas gemm 55%的性能,例如:
float b=bSM[ki][8*vx+ni]给了来自共享内存的银行冲突负载。考虑在经线中的前16个线程。<代码> Vx<代码>范围从0到15。在这些线程中,您的乘法为8。这将导致四路存储体冲突。为了使矩阵矩阵有效地与共享内存相乘,我建议在C.和Cou.中给出示例。rse,如果你真的想使用快速矩阵乘法,请使用CUBLAS。@RobertCrovella首先感谢你用详细的答案回答了我的所有问题!我试图从中实现采样softmax的修改版本,如果我们说a和B是行向量和列向量的集合,那么a中的每个向量都被多重化为唯一的suB中的向量集。例如,A的第一行乘以B矩阵的第2、40、800列,A的第二行乘以B矩阵的第5、80、400列,依此类推。我认为这不能用CUBLAS GEMM实现,这就是为什么我试图在cuda中实现一个。@RobertCrovella有什么策略可以避免银行冲突?我应该告诉我们吗e类似于float3而不是中建议的float?