C OpenMP任务的任务调度点

C OpenMP任务的任务调度点,c,performance,parallel-processing,openmp,C,Performance,Parallel Processing,Openmp,我有以下代码: #pragma omp parallel { #pragma omp single { for(node* p = head; p; p = p->next) { preprocess(p); #pragma omp task process(p); } } } 我想知道线程何时开始计算任务。使用#pragma omp task

我有以下代码:

#pragma omp parallel
{
    #pragma omp single
    {
        for(node* p = head; p; p = p->next)
        {
            preprocess(p);

            #pragma omp task
            process(p);
        }
    }
}
我想知道线程何时开始计算任务。使用#pragma omp task创建任务后,还是仅在创建所有任务后

编辑:


在您的示例中,工作线程可以在创建任务后立即开始执行这些任务。在执行第一个任务之前,无需等待所有任务的创建完成

因此,基本上,在生产者创建了第一个任务之后,一个工人将拿起它并开始执行该任务。但是,请注意,OpenMP运行时和编译器在这方面有一定的自由。他们可能会稍微推迟执行,甚至会就地执行一些任务

如果您想阅读详细信息,您需要在www.OpenMP.org上浏览OpenMP规范。这有点难读,但它是确定的信息来源

干杯,
-michael

当我用omp_get_thread_num()打印进程(p)内的线程数时,它总是显示线程0。它不应该在线程之间切换吗?我已经解决了这个问题,但是谢谢。现在我又得到了一个。我将代码更改为上面编辑中的代码。我想处理以前计算过的数组的副本。在每次迭代I中,数组都会更新。我可以使用firstprivate来防止线程正在处理的数组得到更新吗?如果您可以在此处发布原始问题的解决方案,以便其他用户也可以使用它,那就太好了。你新问题的答案是:不,你不能。firstprivate将私有化指针的副本,但不会私有化指向的数据。你需要自己做。问题是我在一个不支持OpenMP任务的旧编译器上编译。我一换上新的就开始工作了。对于静态数组,firstprivate可以工作,但由于某些原因,只有主线程执行并行区域。你知道为什么吗?
int* array = (int*)malloc...
#pragma omp parallel
{
    #pragma omp single
    {
        while(...){
            preprocess(array);

            #pragma omp task firstprivate(array)
            process(array);
        }
    }
}