【发布时间】:2011-07-09 04:35:32
【问题描述】:
所以转置矩阵的明显方法是使用:
for( int i = 0; i < n; i++ )
for( int j = 0; j < n; j++ )
destination[j+i*n] = source[i+j*n];
但我想要一些可以利用局部性和缓存阻塞的东西。我正在查找它,但找不到可以执行此操作的代码,但有人告诉我它应该是对原始代码的非常简单的修改。有任何想法吗?
编辑:我有一个 2000x2000 矩阵,我想知道如何使用两个 for 循环更改代码,基本上将矩阵拆分为我单独转置的块,例如 2x2 块或 40x40 块,然后查看哪种块大小最有效。
Edit2:矩阵按列主要顺序存储,即矩阵
a1 a2
a3 a4
存储为a1 a3 a2 a4。
【问题讨论】:
-
当心,因为一个非常热门的现代编译器可能会通过使用完全重新设计代码的强大优化来为您解决这个问题。查看关键字限制。查看所有优化开关,例如 gcc,例如必须从使用 -O3 或 -O2 开始,以最快者为准,并且必须使用开关来支持您的现代 cpu 的完整指令集,例如gcc -march=haswell。不要使用垃圾编译器。 Gcc Intel 和 llvm/clang 都很好。