【问题标题】:How to optimise a[i] = -b[i] * (c[i] + d);如何优化 a[i] = -b[i] * (c[i] + d);
【发布时间】:2019-04-14 11:56:41
【问题描述】:

只是想知道,鉴于下面的代码,有没有更好的编写方法来提高性能?

int i, N;
double a[], b[], c[], d;
for (i = 0; i < N; i++) {
    a[i] = -b[i] * (c[i] + d);
}

【问题讨论】:

  • 优化?什么不是最佳的?而且您的代码在语法上无效。
  • 请将其包装成minimal reproducible example,以便指出优化前存在的问题。然后,为了优化工作代码,首选 codereviewers。
  • 这是适合 CUDA 和 OpenCL 的工作。使用 GPU,您可以获得性能(执行时间)。

标签: c loops optimization


【解决方案1】:

正如所写,您的代码未显示正确的 abc 声明。如果它们实际上是指针(包括声明为数组的函数参数)或指向结构中的数组,请确保尽可能使指针 restrict 合格。这将使一个体面的编译器可以矢量化你的循环。

您可以在从 P__J__ 的答案链接的示例代码中看到 restrict 的效果(以及如果您删除它会发生什么)。没有它,编译器不能假设a 不指向与bc 指向的内存重叠,因此它无法加载b[i+1]c[i+1],直到a[i] 被存储。这完全排除了并行加载它们,即基本上排除了矢量化。

否则,不,您的循环是最佳的。

【讨论】:

  • 你可以添加一个简短的解释restrict的效果。
【解决方案2】:

编译器在优化这样的东西方面做得很好

https://godbolt.org/z/Q8sWqp

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-30
    • 2021-11-01
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2012-07-29
    • 1970-01-01
    相关资源
    最近更新 更多