考虑以下示例,OpenMP要求必须确定buff1
和buff2
中存储的地址。但是,buff1
和buff2
中存储的地址是根据运行任务的线程的id(myid
)确定的。我怎样才能解决我的问题?任何解决方案都很受欢我不被允许分配内存。
mystruct* buff1;
mystruct* buff2;
#pragma omp task depend(in: data[0:1000]) depend(inout: buff1[0:0])
{
int myid=omp_get_thread_num();
buff1=buffers[myid];
processA(data, buff1);
}
#pragma omp task depend(in: data[0:1000]) depend(inout: buff2[0:0])
{
int myid=omp_get_thread_num();
buff2=buffers[myid];
processB(data, buff2);
}
#pragma omp task depend(in: data[0:1000]) depend(inout: buff1[0:0]) depend(inout: buff2[0:0])
{
processC(data, buff1, buff2);
}
答案 0 :(得分:0)
创建任务时会注册任务依赖项。请注意,必须在开始执行任务之前完成它们,因此您无法提出要求。
您是否考虑过直接定义buff1
和buff2
的依赖关系而不是他们指向的内容?
mystruct* buff1;
mystruct* buff2;
#pragma omp task depend(in: data[0:1000]) depend(inout: buff1) shared(buff1)
{
int myid=omp_get_thread_num();
buff1=buffers[myid];
processA(data, buff1);
}
#pragma omp task depend(in: data[0:1000]) depend(inout: buff2) shared(buff2)
{
int myid=omp_get_thread_num();
buff2=buffers[myid];
processB(data, buff2);
}
#pragma omp task depend(in: data[0:1000]) depend(inout: buff1, buff2) // shared(buff1, buff2) ???
{
processC(data, buff1, buff2);
}
注意这两个条款的含义差异非常重要:depend(inout: buff1)
和depend(inout: buff1[0:0])
。第一个定义了对&buff1
的依赖,而第二个定义了对&buff1[0] = &(*(buff1 + 0)) = buff1
的依赖。通常,当任务生成指针本身的值(并且它通常与shared
子句一起使用)时使用第一个,而在任务修改时使用第二个。该指针指向的数据。
最后,您没有指定buff1
和buff2
变量的数据共享。如果必须从外部看到您的任务对这些变量所做的更改,则必须将这些变量注释为共享。