如何确保OpenMP线程并行运行?

时间:2014-12-16 15:38:47

标签: multithreading pthreads openmp multicore

我正在开发一些OpenMP程序,我有以下代码:

   #pragma omp parallel sections shared(a, b, r1, r2)
   {
        #pragma omp section
        {
           a = 1;
           r1 = b;
        }

        #pragma omp section
        {
           b = 1;
           r2 = a;
        }
   }

我想在这里观察的主要内容是r1 = 1r2 = 1(这是规范允许的)但是我已经运行了这段代码片段超过1000000次,我无法观察到它。我得到的唯一结果是r1 = 0, r2 = 1(我期待其中至少有一些是r1 = 1, r2 = 0。我想知道实现是否正在序列化我的程序。我使用omp_set_num_threads(2);强制两个线程,但我怎么能确定这两个线程实际上是在两个物理内核上运行的(我使用的是双核Macbook pro,我使用的是自制的gcc-4.9)。

1 个答案:

答案 0 :(得分:2)

你的榜样非常好。问题是两个线程的最小工作负载。第1节计划将#0和第2节线程连接到线程#1。但是,线程#0在线程#1启动之前完成了他的工作。它看起来就像你的部分的顺序执行。

我修改了你的例子:

#include <iostream>
#include <unistd.h>
int main()
{
    int a, b, r1=0, r2=0;
    #pragma omp parallel sections shared(a, b, r1, r2)
    {
        #pragma omp section
        {
            a = 1;
            sleep(10);
            std::cout << "section #1" << std::endl;
            r1 = b;
        }
        #pragma omp section
        {
            b = 1;
            sleep(5);
            std::cout << "section #2 "<< std::endl;
            r2 = a;
        }
   }
   std::cout << r1 << r2 << std::endl;
}

输出显示

  

第2节

     

第1节

     

11

正如您可能预期的那样。