我想在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'?
答案 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 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 :(得分: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()
值;虽然,在调试时会很明显。