无法理解 OpenMP 部分

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

最佳答案

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

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

关于无法理解 OpenMP 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10720231/

相关文章:

c++ - 使用 ESP Open SDK 部署到 ESP8266

c++ - VS10下openmp语法错误

c++ - 为什么ubuntu 12.04下的OpenMP比串口版本慢

c++ - Debug 和 Release 之间的不同结果

c - 是否可以在运行时创建 "C"语句并执行它们?

c中字符串与字符数组的比较

c - 为什么我总是得到8?

c - Printf 没有显示第一个,只显示后面的

multithreading - 不同主机上的 OpenMP 程序

c - 在集群的单个节点上运行 OpenMP