我正在尝试优化在并行区域(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;
但是整个执行过程需要更多的时间(这很清楚)。但我可以相信哪些结果?或者我可以使用哪些替代软件进行测试。
提前致谢!