我有这个使用部分
的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打印所有三行,有时不同的线程执行它。我不明白这一点,不应该从三个不同的线程中打印三行吗?
答案 0 :(得分:1)
OpenMP不保证您期望的行为。这些部分构造保证(至少,构造保证的规范,实现可能被破坏),每个部分由一个(并且只有一个)线程执行。它并不保证每个部分都由不同的线程执行。
在您观察到的级别上,您观察到您的程序是非确定性的。对于并行程序而言,这并不罕见,需要牢记这一教训;在某些情况下,如果有必要,程序员有责任命令执行代码段。
答案 1 :(得分:1)
Open MP保证每个部分将由不同的线程执行以进行并发计算。
您的第一个语句可以由创建的8个线程中的任何一个执行,但第2个和第3个打印语句将由8个线程中的任意两个不同线程执行。如果没有发生,请将第一个语句放在pragma section指令下。然后所有三个语句将由不同的线程执行。