【发布时间】:2011-03-22 19:54:18
【问题描述】:
我试图理解为什么 OpenMP 会按照以下示例中的方式工作。
#include <omp.h>
#include <iostream>
#include <vector>
#include <stdlib.h>
void AddVectors (std::vector< double >& v1,
std::vector< double >& v2) {
size_t i;
#pragma omp parallel for private(i)
for (i = 0; i < v1.size(); i++) v1[i] += v2[i];
}
int main (int argc, char** argv) {
size_t N1 = atoi(argv[1]);
std::vector< double > v1(N1,1);
std::vector< double > v2(N1,2);
for (size_t i = 0; i < N1; i++) AddVectors(v1,v2);
return 0;
}
我首先在没有启用 OpenMP 的情况下编译了上面的代码(通过在编译标志上省略 -fopenmp)。 N1 = 10000 的执行时间为 0.1 秒。启用 OpenMP 会使执行时间超过 1 分钟。我在它完成之前停止了它(厌倦了等待......)。
我正在编译如下代码:
g++ -std=c++0x -O3 -funroll-loops -march=core2 -fomit-frame-pointer -Wall -fno-strict-aliasing -o main.o -c main.cpp
g++ main.o -o main
这里并非所有这些标志都是必需的,但我正在尝试并行化的项目中使用它们,并且在那里使用这些标志。这就是为什么我决定把他们留在这里。另外,我添加了 -fopenmp 以在编译时启用 OpenMP。
有人知道出了什么问题吗?谢谢!
【问题讨论】:
-
只是一个猜测,但是:您是否尝试将循环最大值 (
v1.size()) 存储在循环之前的临时变量中,并在 for-loop 子句中使用该变量?也许编译器看不到 size() 的返回值由于某种原因没有改变。 -
您的代码现在看起来很奇怪。 N1 作为向量的长度和循环的运行次数?这是故意的吗?
-
无法重现,在这里可以正常工作(N1=100000,17s 没有 openmp,4.7s 使用 Core2 Quad)。你有什么版本的 GCC?什么类型的CPU
-
Ronny:我之前有一个错误——我将 N1 和 N2 设置为 atoi(argv[1]) 所以我放弃了 N2。看起来很奇怪,但不会改变我的结果。
-
好吧,WorksForMe(tm) 与 G++ 4.5.1 (Gentoo)。无关:C++ 有一个
<cstdlib>标头,我认为它比<stdlib.h>更“合适”。