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