我有这个使用节的 OpenMP 代码
#pragma omp parallel sections num_threads(8)
{
printf_s("Allo from thread %d\n", omp_get_thread_num());
#pragma omp section
printf_s("Bello from thread %d\n", omp_get_thread_num());
#pragma omp section
printf_s( "Cello from thread %d\n", omp_get_thread_num());
}
我得到不同类型的输出。有时只有线程 0 打印所有三行,有时是不同的线程执行。我不明白这一点,三行不应该总是从三个不同的线程打印吗?
最佳答案
OpenMP 不保证您期望的行为。部分构造保证(至少,构造保证的规范,实现可能会被破坏)每个部分由一个(且仅一个)线程执行。它不保证每个部分都由不同的线程执行。
正如您所观察到的,在您观察到的级别上,您的程序是不确定的。这对于并行程序来说并不罕见,也是一个值得牢记的教训。在某些情况下,如果有必要,程序员有责任命令执行代码段。关于无法理解 OpenMP 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10720231/