使用您的代码:
#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 个不同的任务(例如),这些任务也可能由同一个线程执行。