Matrix 使用SSE在列主顺序和行主顺序之间转换的最佳方式

Matrix 使用SSE在列主顺序和行主顺序之间转换的最佳方式,matrix,x86,transpose,sse,intrinsics,Matrix,X86,Transpose,Sse,Intrinsics,假设这个2d(3,4)数组按行的主要顺序存储: 0 1 2 3 | 4 5 6 7 | 8 9 10 11 我的目标是将其更改为列主顺序: 0 4 8 | 1 5 9 | 2 6 10 | 3 7 11 ->最快的方法是什么 我尝试的是: 如果矩阵是对称的(NxN),我使用英特尔的_MM_TRANSPOSE4_PS 如果矩阵不是对称的(MxN,M!=N):我根据此处提供的英特尔指令集开发了一个转置函数: 它显示了良好的效果,但一旦阵列非常大(例如120k*120k*complex6

假设这个2d(3,4)数组按行的主要顺序存储:

0 1  2  3 | 4 5  6  7 | 8 9 10 11
我的目标是将其更改为列主顺序:

0 4 8 | 1 5 9 | 2 6 10 | 3 7 11
->最快的方法是什么

我尝试的是:

  • 如果矩阵是对称的(NxN),我使用英特尔的_MM_TRANSPOSE4_PS
  • 如果矩阵不是对称的(MxN,M!=N):我根据此处提供的英特尔指令集开发了一个转置函数: 它显示了良好的效果,但一旦阵列非常大(例如120k*120k*complex64),端口5上的压力将显著增加,性能将显著降低,如第14-11章所述
  • 此外,使用较少洗牌的想法也没有真正的帮助。将混洗移动到加载端口2、3
  • 聚集和分散操作非常慢,因此没有选择

有什么我不知道的技巧吗:D

你的例子是一个很小的矩阵,它适合几个SIMD寄存器。但听起来你真正的问题是不适合缓存的大型矩阵。通常可以避免转置它们,例如,进行matmul的最有效方法不是先转置一个矩阵。相反,要利用一次读取4或8列的优势。或者,如果确实需要转置,请缓存块或平铺循环,以便在触摸缓存线后使用缓存线中的所有数据。矩阵的子矩形包含几个完整的缓存线。感谢您的快速回复!这个例子只是为了举例说明。如何执行良好的缓存?我将大矩阵划分为块,然后缓存这些块。