【发布时间】:2015-12-24 14:20:36
【问题描述】:
我有代码
#include <iostream>
#include <vector>
#include <ctime>
using namespace std;
void foo(int n, double* a, double* b, double *c, double*d, double* e, double* f, double* g)
{
for (int i = 0; i < n; ++i)
a[i] = b[i] * a[i] + c[i] * (d[i] + e[i] + f[i] + g[i]);
}
int main()
{
int m = 1001001;
vector<double> a(m), b(m), c(m), d(m), f(m);
clock_t start = std::clock();
for (int i = 0; i < 1000; ++i)
foo(1000000, &a[0], &b[0], &c[0], &d[0], &d[1], &f[0], &f[1000] );
double duration = (std::clock() - start) / (double)CLOCKS_PER_SEC;
cout << "Finished in " << duration << " seconds [CPU Clock] " << endl;
}
你能给我一个可行的例子来优化它以获得更好的性能吗?任何编译器都可以,例如 Intel c++ 编译器和 Visual c++ 编译器。请推荐一个性能良好的 CPU 来完成这项工作。
【问题讨论】:
-
这个问题听起来很笼统,但我会给出一个具体的建议:您是否验证过代码是矢量化的?
-
你可以试试 openmp
#pragma omp parallel for见en.wikipedia.org/wiki/OpenMP -
我使用visual c++,它是矢量化的。不确定我是否可以获得比编译器的自动矢量化更好的性能。
-
取决于自动矢量化器在做什么,你能显示反汇编吗?
-
可以改进您的代码的一件事是,如果您没有创建多个双精度类型的向量,而是创建一个具有包含双精度值的结构的向量。原因是对于一个循环迭代,CPU 总是需要获取五个不同缓存行中的值。此外,我会避免将相同的数组但不同的偏移量(
d[0]vsd[1])传递给函数。这使优化器和读者更容易弄清楚发生了什么。
标签: c++ loops optimization vectorization multicore