OpenMP任务和线程创建

时间:2013-02-10 17:51:48

标签: c multithreading parallel-processing task openmp

我想在OpenMP程序中获取不同线程的ID(Linux中的C代码)。为什么我为以下代码获得相同的线程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);
 ....

为什么id1和id2都得到'0'?

2 个答案:

答案 0 :(得分: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 pragmaOpenMP 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 :(得分:1)

尝试

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

GDB可用于debug a program with multiple threads。使用它来逐步执行代码以了解每个线程的omp_get_thread_num()值;虽然,在调试时会很明显。