OpenMP 似乎没有并行运行

use*_*068 3 c c++ parallel-processing multithreading openmp

我正在尝试用 C++ 编写我的第一个 openmp 程序,我的代码是:

#pragma omp parallel for num_threads(2)
for (int i=0;i<16;++i)
{
    printf( "Thread %d works with idx %d\n", omp_get_thread_num(), i);
}
Run Code Online (Sandbox Code Playgroud)

我用 g++ -O3 -fopenmp -std=c++11 编译

然而,当我运行该程序时,我得到:

Thread 0 works with idx 0
Thread 0 works with idx 1
Thread 0 works with idx 2
Thread 0 works with idx 3
Thread 0 works with idx 4
Thread 0 works with idx 5
Thread 0 works with idx 6
Thread 0 works with idx 7
Thread 1 works with idx 8
Thread 1 works with idx 9
Thread 1 works with idx 10
Thread 1 works with idx 11
Thread 1 works with idx 12
Thread 1 works with idx 13
Thread 1 works with idx 14
Thread 1 works with idx 15
Run Code Online (Sandbox Code Playgroud)

它是并行运行的吗?我期待类似 thread0 - thread1 - thread0 - thread1 的东西,一个接一个。

这里会出现什么问题呢?

dre*_*ash 6

是的,它是并行运行的。您可以看到正在打印的两个不同线程的 ID。

我期待类似 thread0 - thread1 - thread0 - thread1 的东西,一个接一个。

由于您没有定义并行循环的调度,因此默认情况下它将把循环迭代划分为块并将它们分配给线程。在你的情况下,thread 0有块from 0 to 7thread 1来自 的块8 - 15

如果您希望线程以循环方式工作(一个接一个),您必须声明一个静态并行 for 并调度 chunk = 1,例如:#pragma omp parallel for schedule (static,1)

#pragma omp parallel for schedule (static,1) num_threads(2)
for (int i=0;i<16;++i)
{
    printf( "Thread %d works with idx %d\n", omp_get_thread_num(), i);
}
Run Code Online (Sandbox Code Playgroud)

有关 openMP 循环静态调度的更多信息:

将循环划分为大小相等的块,或者在循环迭代次数不能被线程数乘以块大小整除的情况下尽可能相等。默认情况下,块大小为loop_count/number_of_threads。将块设置为1以交错迭代。

来源:OpenMP* 循环调度