【发布时间】:2010-12-17 01:41:01
【问题描述】:
为简单起见,假设我有一个由 N 矩阵组成的向量,每个矩阵 M 行。我正在使用 STL std::accumulate 来计算所有矩阵的总和。我传递了一个二进制函子,它接受两个矩阵(通过引用)并返回它们的总和(通过引用)。全面披露:我正在使用 libstdc++ 并行模式。在函子内部,我逐行循环以计算总和。
虽然每个矩阵都太大而无法放入缓存中,但一行非常适合。因此,重新排序循环将是有利的,以便外部循环索引M 行,而内部循环索引N 矩阵。除了定义内联函子之外,我还能做些什么来鼓励这种跨功能边界循环重新排序。我当然可以重构代码,但理想情况下我希望保持使用 STL 算法提供的简单结构。如果有特定于 gcc 的东西,我也不介意。
我实际上并不是在处理矩阵,这只是一个例子,但同样的问题结构也适用。主要问题是性能问题。解释实际场景太麻烦了,但核心问题是:STL 的累积需要在嵌套循环之间进行排序,这对缓存不是很友好,因为它试图在移动到下一个对象之前完成两个对象的相加。单个对象太大而无法保存在缓存中,但它的一部分可以。因此,如果一次计算“加法”一个“部分”(在所有对象上),则可以加快执行速度。手动重新排序循环可以显着提高 FLOPS。但理想情况下,我希望编译器进行重新排序,以便我可以在 STL 级别(尽可能)进行编码。所以我正在寻找技巧来做到这一点。
【问题讨论】:
-
我不明白这个问题。你有性能问题吗?你能告诉我们你有什么吗?
-
@wilhelmtell 我添加了更多细节。希望现在清楚一点。
-
我赞成到目前为止收到的所有三个建议。我仍在寻找一种方法来提示编译器做正确的事情。因为正确的东西因缓存大小而异。可能的解决方案是使用预处理器进行条件编译。
-
都是很好的答案,基本上都指向同一件事。但是我只能接受一个,所以我选择了最明确的一个。
标签: c++ stl compiler-optimization