OpenMP任务和线程创建

4

我希望获取OpenMP程序中不同线程的ID。为什么以下代码获得相同的线程ID?

#pragma omp task untied
     id1 = omp_get_thread_num(); printf("TID:%d\n",id1);
     foo_par(A);
#pragma omp task untied
     id2 = omp_get_thread_num(); printf("TID:%d\n",id2);
     foo_par(B);
 ....

为什么我在id1id2中都得到了'0'?

1
请尝试阅读OpenMP规范第2.7节:您会注意到,您的问题"据我所知,在OpenMP中为每个任务创建一个线程" 的前提是不正确的。 - Massimiliano
2个回答

2

使用您的代码:

#pragma omp task untied
     id1 = omp_get_thread_num(); printf("TID:%d\n",id1);
     foo_par(A);
#pragma omp task untied
     id2 = omp_get_thread_num(); printf("TID:%d\n",id2);
     foo_par(B);

因为你没有使用 {},所以只有这个指令 omp_get_thread_num(); 会成为一个任务。

顺便提醒一下,task pragma 是从 OpenMP 3.0 开始支持的。如果你的 GCC 版本早于 4.4,那么任务指令将被忽略。

尝试以下操作:

#pragma omp parallel region
{
  #pragma omp single
  {
   #pragma omp task untied
   {
     id1 = omp_get_thread_num(); printf("TID:%d\n",id1);
     foo_par(A);
   }

   #pragma omp task untied
   {
     id2 = omp_get_thread_num(); printf("TID:%d\n",id2);
     foo_par(B);
   }
 }
}

单一构造体是必要的,这样任务只会被一个线程创建。否则,每个任务将被创建N次(N == 线程数)。

请注意,如果一个线程“X”能够完成他们的工作并请求池中的另一个任务,在团队中的另一个线程之前可能会开始。换句话说,即使您定义了2个不同的任务(例如),这些任务也可能由同一个线程执行。


1

尝试

#pragma omp task untied
if (omp_get_thread_num() == 1)
  foo_par(A);
else
  foo_par(B);

GDB可以用于调试多线程程序。使用它来逐步执行代码以了解每个线程的omp_get_thread_num()值;尽管在调试过程中也会很明显。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接