【发布时间】:2015-03-13 18:01:18
【问题描述】:
给定以下代码,其中 a、b、c、d 等是常量:
Data[] dataArray;
Intermediate[] interArray;
Output[] outputArray;
for (int i = 0; i < length; i++)
{
interArray[i] = (c * dataArray[i]) + (a * dataArray[i+1]);
interArray[i] -= (b * interArray[i - 1]) + (d * interArray[i - 2]);
outputArray[i] = interArray[i];
}
for (int i = ln-1; i > 0; i--)
{
interArray[i - 1] = (e * dataArray[i]) + (f * dataArray[i-1]);
interArray[i - 1] -= (g * interArray[i]) + (h * interArray[i+1]);
outputArray[i] += interArray[i];
}
如何优化?
我只想遍历数组一次。不幸的是,我依赖于这样一个事实,即第二个循环需要 interArray 由第一个循环填充。
我想这样做的原因是因为这个过程占用了我总运行时间的 20%,我正在尝试优化它。数组可能非常大,类型通常是大型 POD。我假设我正在进入缓存垃圾领域,这就是为什么我试图减少我走过阵列的次数。没有 * 运算符,它只是标准乘法。
注意:我知道数组的上限和下限在此处崩溃并烧毁,因为超出了界限。我会手动处理这些。
任何建议将不胜感激!可能我做不到更快,但我想至少尝试一下!
【问题讨论】:
-
您是否在发布时对此进行测量? - 只是为了检查。
-
您可以尝试使用 simd,或在编译器中启用自动矢量化。但我的猜测是你已经受到内存带宽的限制(一个好的分析器可以告诉你这一点)。您可以随时尝试交织您的值以可能会有所改善。
-
@LogicStuff:是的。我只是有一个想法——我想我可以先发制人地计算出我需要的值,然后一次性完成?
-
interArray[i]依赖于interArray[i - 1]和interArray[i - 2]所以向量化这个并不容易 -
说到缓存,如果您的阵列不在同一缓存行上竞争,它可能会有所帮助。阅读 Sutter 关于它的文章(它与线程相关,但也可能在这里工作):drdobbs.com/parallel/eliminate-false-sharing/217500206
标签: c++ arrays optimization