无法理解OpenMP部分

时间:2012-05-23 12:47:38

标签: c openmp

我有这个使用部分

的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打印所有三行,有时不同的线程执行它。我不明白这一点,不应该从三个不同的线程中打印三行吗?

2 个答案:

答案 0 :(得分:1)

OpenMP不保证您期望的行为。这些部分构造保证(至少,构造保证的规范,实现可能被破坏),每个部分由一个(并且只有一个)线程执行。它并不保证每个部分都由不同的线程执行。

在您观察到的级别上,您观察到您的程序是非确定性的。对于并行程序而言,这并不罕见,需要牢记这一教训;在某些情况下,如果有必要,程序员有责任命令执行代码段。

答案 1 :(得分:1)

Open MP保证每个部分将由不同的线程执行以进行并发计算。

您的第一个语句可以由创建的8个线程中的任何一个执行,但第2个和第3个打印语句将由8个线程中的任意两个不同线程执行。如果没有发生,请将第一个语句放在pragma section指令下。然后所有三个语句将由不同的线程执行。