为什么需要swizzle
e.g.
- 转置
- ldmatrix
假设有4路bank, 列向能并行
转置
e.g. 把如下矩阵转置。
1 | 0 1 2 3 |
此时4路bank只用了1路。bank conflict。
1 | 0 x |
ldmatrix
ldmatrix可以一次加载一个matrix。但是matrix的行和行之间不一定是连续的,所以会有bank conflict。
swizzle可以把matrix的不同行的列地址错开, 以减少bank conflict。
1 | Smem layout: |
因为ldmatrix一次是传入一行(这里一行是2列元素)的地址的, 所以swizzle后再加载数据仍能保持一致。e.g.
swizzle前
1 | 0 1 x x |
swizzle后
1 | 0 1 x x |
swizzle in action
1 |
|
运行发现成功把一个matrix的加载在行上错开了
1 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, |
原本要load的matrix是0, ..., 7的这个4x8
1 | 0, 1, 2, 3, 4, 5, 6, 7, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, |
swizzle后要load的matrix是还是0, ..., 7的这个4x8, 但是每行的列地址错开了
1 | 0, 1, 2, 3, 4, 5, 6, 7, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, |