0

我有这个使用部分的 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 打印所有三行,有时不同的线程会打印。我不明白这一点,三行不应该总是从三个不同的线程中打印出来吗?

4

2 回答 2

1

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

正如您所观察到的,在您观察到的级别上,您的程序是不确定的。这对于并行程序来说并不少见,值得牢记的教训;在某些情况下,如果有必要,程序员有责任命令执行代码段。

于 2012-05-23T13:56:12.353 回答
1

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

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

于 2012-06-18T06:41:44.837 回答