【发布时间】:2016-02-23 15:14:53
【问题描述】:
我编写了一个简单的 for 循环,它将一个常量分配给一个数组。
#include <iostream>
#include <vector>
#include <cstdlib>
#include "omp.h"
using namespace std;
int nr_threads = 1;
long J = 10000000;
long K = 40;
int main(int argc, char* argv[])
{
nr_threads = atoi(argv[1]);
vector<double> H_U_d(J*K, 1);
double start_time = omp_get_wtime();
#pragma omp parallel for num_threads(nr_threads) schedule(static)
for(long j = 0; j < J*K; j++)
{
H_U_d[j] = 1;
}
cout << omp_get_wtime()-start_time << endl;
return 0;
}
我使用 gcc 编译它,g++ main.cpp -o test_speedup -fopenmp 并在 12 核机器上测试它。
我的系统是 Ubuntu 14.04.3,cpu 是 Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00GHz 和 128GB RAM。
如果不进行优化,我们可以得到这样的结果:
➜ ~ ./test_speedup 1
2.95739
➜ ~ ./test_speedup 8
0.483756
加速约为 6。
但是如果我使用 -O3 来优化它,g++ main.cpp -o test_speedup -fopenmp -O3
结果是
➜ ~ ./test_speedup 1
0.379158
➜ ~ ./test_speedup 8
0.265842
加速很差。
gcc 如何优化循环?有什么解决方案可以避免这种情况吗?
【问题讨论】:
-
OpenMP 花一些时间来创建线程。尝试运行时间更长的测试。
-
优化的单线程循环已经非常优化了,可能会使用 SIMD 指令来加速。当代码已经是最佳时,添加线程根本没有太大帮助。我建议您检查汇编代码并在汇编级别上比较未优化和优化的代码。
-
如果您想了解编译器在做什么,您可以从查看生成的程序集开始。
gcc -S在源代码上或objdump -d在二进制文件上。
标签: c++ gcc parallel-processing openmp compiler-optimization