omp并行与omp并行for

这两者有什么区别?

[一个]

#pragma omp parallel { #pragma omp for for(int i = 1; i < 100; ++i) { ... } } 

[B]

 #pragma omp parallel for for(int i = 1; i < 100; ++i) { ... } 

我不认为有什么区别,一个是另一个的捷径。 尽pipe你的确切实现可能会以不同的方式处理。

组合的并行工作共享结构是指定包含一个工作共享结构并且没有其他语句的并行结构的快捷方式。 允许的条款是并行和工作共享条款允许的条款的结合。

取自mp-documents/OpenMP3.0-SummarySpec.pdf

OpenMP的规格如下:

http://openmp.org/wp/openmp-specifications/

这些是相同的。

#pragma omp parallel生成一组线程,而#pragma omp for在生成的线程之间分割循环迭代。 您可以使用融合的#pragma omp parallel for指令同时执行这两个操作。

这里是使用分离的parallelfor 这里的例子。 简而言之,它可以用于在多个线程中执行循环之前dynamic分配OpenMP线程 – 专用arrays。 情况parallel for相同的初始化是不可能的。

UPD:在问题的例子中,单个附注和两个编译指示没有区别。 但在实践中,您可以使用分离的并行和指令来使更多的线程感知行为。 一些代码例如:

 #pragma omp parallel { double *data = (double*)malloc(...); // this data is thread private #pragma omp for for(1...100) // first parallelized cycle { } #pragma omp single {} // make some single thread processing #pragma omp for // second parallelized cycle for(1...100) { } #pragma omp single {} // make some single thread processing again free(data); // free thread private data } 

尽pipe具体例子的两个版本都是相同的,如其他答案中已经提到的那样,但它们之间仍然有一个小的差别。 第一个版本包含一个不必要的隐含障碍,在“omp for”结尾处遇到。 另一个隐性屏障可以在并行区域的末尾find。 将“nowait”添加到“omp for”会使两个代码相当,至less从OpenMP的angular度来看。 我提到这一点,因为OpenMP编译器可能会为这两种情况生成稍微不同的代码。

我看到完全不同的运行时,当我在g ++ 4.7.0 for循环和使用

 std::vector<double> x; std::vector<double> y; std::vector<double> prod; for (int i = 0; i < 5000000; i++) { double r1 = ((double)rand() / double(RAND_MAX)) * 5; double r2 = ((double)rand() / double(RAND_MAX)) * 5; x.push_back(r1); y.push_back(r2); } int sz = x.size(); #pragma omp parallel for for (int i = 0; i< sz; i++) prod[i] = x[i] * y[i]; 

串行代码(无openmp )运行在79毫秒。 “并行”代码在29 ms内运行。 如果我省略并使用#pragma omp parallel ,则运行时间最高可达179ms,比串行代码慢。 (机器有8个并发)

代码链接到libgomp