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);
 ....

为什么我得到 '0'id1id2

4

2 回答 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 个不同的任务(例如),这些任务也可能由同一个线程执行。

于 2013-02-10T19:37:41.243 回答
1

尝试

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

GDB 可用于调试具有多个线程的程序。使用它来逐步执行代码以了解omp_get_thread_num()每个线程的值;但是,在调试时会很明显。

于 2013-02-14T15:54:12.587 回答