【发布时间】:2016-04-02 21:16:58
【问题描述】:
我正在试验 OpenMP。我写了一些代码来检查它的性能。在带有 Kubuntu 11.04 的 4 核单 Intel CPU 上,使用 OpenMP 编译的以下程序比没有使用 OpenMP 编译的程序慢大约 20 倍。为什么?
我是通过 g++ -g -O2 -funroll-loops -fomit-frame-pointer -march=native -fopenmp 编译的
#include <math.h>
#include <iostream>
using namespace std;
int main ()
{
long double i=0;
long double k=0.7;
#pragma omp parallel for reduction(+:i)
for(int t=1; t<300000000; t++){
for(int n=1; n<16; n++){
i=i+pow(k,n);
}
}
cout << i<<"\t";
return 0;
}
【问题讨论】:
-
我从未使用过 openMP,但在我看来,创建多个线程和在这些线程之间同步共享数据访问的开销超过了(很多)将处理分布在 4 个不同的内核上。
-
不过20次似乎有点太极端了。
-
如果您正在尝试检查 OpenMP 性能,那么使用设计更好的可并行化代码将是一个好主意。
-
我刚刚获取了您的程序并在具有 2 个处理器的 Ubuntu 11.04 系统上运行它。我做了一个简单的编译(g++ 4.5.2 没有选项)和一个 OpenMP 编译(g++ -fopenmp)并运行它们。串行程序的运行时间为 6:45.41,而 OpenMP 程序(在 2 个处理器上运行)花费了 3:36.61(使用时间来测量)。考虑到您的程序,这是我所期望的。我会尝试你的选择,看看会发生什么。
-
同意ejd。我看到在 4 核机器上使用 gcc 4.8 使用 OpenMP(使用问题中提到的选项)的速度提高了大约 4 倍。开销很少。