我有以下代码:
#pragma omp parallel
{
#pragma omp single
{
for(node* p = head; p; p = p->next)
{
preprocess(p);
#pragma omp task
process(p);
}
}
}
我想知道线程什么时候开始计算任务。只要使用#pragma omp任务创建任务,或者仅在创建所有任务后创建任务?
编辑:
int* array = (int*)malloc...
#pragma omp parallel
{
#pragma omp single
{
while(...){
preprocess(array);
#pragma omp task firstprivate(array)
process(array);
}
}
}
答案 0 :(得分:1)
在您的示例中,工作线程可以在创建任务后立即开始执行它们。在执行第一个任务之前,不需要等待完成所有任务的创建。
因此,基本上,在生产者创建第一个任务之后,一个工作人员会将其拾起并开始执行任务。但是,请注意OpenMP运行时和编译器在此方面具有一定的自由度。他们可能会稍微延迟执行,甚至执行一些任务。
如果您想了解详细信息,您需要浏览www.openmp.org上的OpenMP规范。它有点难以阅读,但它是最权威的信息来源。
干杯, -Michael