AyakaGEMM / Hands-on-GEMM

GNU General Public License v3.0
96 stars 14 forks source link

M,N为128的倍数时 运行结果才准确 #8

Closed Zhou-sx closed 1 year ago

Zhou-sx commented 1 year ago

M,N不应该满足4对齐就可以吗 shared_mem_gemm.cu也不对 例如取M=16, N=16, K=8 感觉128x8中有效的部分只有16x8,应该不影响呀

Pzzzzz5142 commented 1 year ago

显然,我写的很暴力,必须得128的倍数(

主要是因为一个block处理的是128x128,读取的时候也是直接写死的读128。代码里面也能看出其实kernel里并没有关于边界的判定(

(既然都有4的倍数的限制了,不如再贯彻的彻底一点。(实际上是我偷懒了(

Pzzzzz5142 commented 1 year ago

关于边界判定,你可以先去看看李少侠的处理方式,他可以使用任意形状的矩阵大小。然后在回写的时候也采用了shared memory来做coalesced access。可以参考一下这个issue: Yinghan-Li/YHs_Sample#2。

主要这两个月我都没有gpu用(就可以光明正大的偷懒了),所以并没有更新。有时间大概可能会加上吧

Zhou-sx commented 1 year ago

我知道具体哪有问题了 读取和计算其实没问题,多出来的部分不会影响结果 但是写回的时候,地址会有冲突 采用朴素的warp排布,如果处理16x16, (1,15) 和 (0, 31) 地址索引是一样的,都是首地址+31个元素大小,后者是因为一个块处理128x128所以这个地址是存在的