我正在学习OpenMP,我想在单核系统上用C理解此代码。 (程序代码不是我的)
#include <stdio.h>
#include <omp.h>
int main()
{
omp_lock_t lock;
#pragma omp parallel num_threads(2)
{
#pragma omp single
{
omp_init_lock(&lock);
omp_set_lock(&lock);
#pragma omp task
{
omp_set_lock(&lock);
printf("task = 0, thread = %d\n", omp_get_thread_num());
}
#pragma omp task
{
printf("task = 1, thread = %d\n", omp_get_thread_num());
omp_unset_lock(&lock);
}
} // end of single region, implicit bar & TSP=Tasking Sync Point
} // end of parallel region, implicit bar
}
在下文中,printf
的调用分别称为task0
和task1
。
这里我有2个两个线程,据我所知,如果我有一个单核系统,则一次只能有一个线程“工作”(在这种情况下,请忽略每个核心的“物理”线程) ,我不知道该如何称呼)。 此示例的目的是必须在task1之前创建task0,但是必须在task0之前执行task1。
文本中的注释说明可以进行线程切换(这到底是什么意思?我猜想,如果线程0在工作,那么即使线程0没有完成工作也可以安排线程1),并且没有任务切换(这意味着如果线程0执行t0,那么它将永远不会执行t1?并且如果线程1执行t1,那么它也会在t1上被“阻塞”,直到完成为止。如果是这样,为什么会这样呢?我们在一个核心系统上)
我也不清楚在第一个任务之前甚至在task0内部是否有双omp_set_lock(&lock)
。