为简单起见,假设我N
每M
行都有一个矩阵向量。我正在使用 STLstd::accumulate
来计算所有矩阵的总和。我传递了一个二进制函子,它接受两个矩阵(通过引用)并返回它们的总和(通过引用)。全面披露:我正在使用 libstdc++ 并行模式。在仿函数内部,我分别遍历行以计算总和。
尽管每个矩阵都太大而无法放入缓存中,但一行非常适合。因此,重新排序循环将是有利的,以便外部循环索引M
行,而内部循环索引N
矩阵。除了定义内联函子之外,我还能做些什么来鼓励这种跨功能边界循环重新排序。我当然可以重构代码,但理想情况下我希望保持使用 STL 算法提供的简单结构。如果有特定于 gcc 的东西,我也不介意。
我实际上并不是在处理矩阵,这只是一个例子,但同样的问题结构也适用。主要问题是性能问题。解释实际场景太麻烦了,但核心问题是:STL 的累加需要在嵌套循环之间进行排序,这对缓存不是很友好,因为它会在移动到下一个对象之前尝试完成两个对象的相加。单个对象太大而无法保存在缓存中,但它的一部分可以。因此,如果一次计算“加法”一个“部分”(在所有对象上),则可以加快执行速度。手动重新排序循环可以显着提高 FLOPS。但理想情况下,我希望编译器进行重新排序,以便我可以在 STL 级别(尽可能)进行编码。所以我正在寻找技巧来做到这一点。