0

我正在尝试优化在并行区域(OpenMP)中调用的部分代码。我使用 Intel VTune Amplifier 2015 进行了内存访问分析,对结果有点困惑。我使用 Intel Composer 2015 重复了优化级别 O1、O2 和 O3 的分析,但结果是相同的。放大器声称,大多数 LLC 未命中出现在以下三行中:

__attribute__ ((aligned(64)))    double       x[4] = {1.e0,-1.e0, 0.e0, 0.e0};
__attribute__ ((aligned(64)))    double       y[4] = {0.e0,-1.e0, 1.e0, 0.e0};
__attribute__ ((aligned(64)))    double       z[4] = {0.e0, 0.e0,-1.e0, 1.e0};

数据是对齐的,因为稍后会在矢量化代码中对其进行访问。我不能在这里发布整个代码,因为它有版权。这大约是这个函数中总缓存未命中的 75%,尽管后面的代码中有很多计算和其他数组。对于 O0 优化,我得到了更现实的结果,因为那里的线条像

res[a] += tempres[start + b] * fact;

但是整个执行过程需要更多的时间(这很清楚)。但我可以相信哪些结果?或者我可以使用哪些替代软件进行测试。

提前致谢!

4

1 回答 1

0

只看百分比可能会产生误导(100 的 75% 小于 1000 的 10%) - 比较时您需要查看未命中的绝对数量。

缓存行为也很难直观,特别是与编译器优化和 CPU 管道相结合。
看起来优化的构建大多在初始化时错过了缓存(这并不奇怪),但设法将几乎整个计算保留在缓存中,所以我在这里看不到问题。

如果您想确定,您需要研究生成的程序集和硬件参考手册。

寻找能够确认您期望的工具在很大程度上是浪费时间,因为您无法确定工具不是错误的工具。

于 2014-12-18T10:00:25.520 回答