do_step_one(i)
从do_step_two(i)
到i
,我有两个函数0
和N-1
。
目前,我有这个(顺序)代码:
for(unsigned int i=0; i<N; i++) {
do_step_one(i);
}
for(unsigned int i=0; i<N; i++) {
do_step_two(i);
}
do_step_one()
和do_step2()
的每次调用都可以按任意顺序并行完成,但任何do_step_two()
都需要do_step_one()
的所有内容开始(它使用) do_step_one()
结果)。
我尝试了以下内容:
#omp parallel for
for(unsigned int i=0; i<N; i++) {
do_step_one(i);
#omp barrier
do_step_two(i);
}
但是gcc抱怨
convolve_slices.c:21:警告:屏障区域可能不会紧密嵌套在工作共享,关键,有序,主要或显式任务区域内。
我误解了什么?如何解决这个问题?
答案 0 :(得分:11)
请注意,如果您想确保不重新创建线程,请将并行声明和声明分开:
#pragma omp parallel
{
#pragma omp for
for(unsigned int i=0; i<N; i++){
do_step_one(i);
}
//implicit barrier here
#pragma omp for
for(unsigned int i=0; i<N; i++){
do_step_two(i);
}
}
答案 1 :(得分:4)
我在这段代码中看到的一个问题是代码不符合规范:)
如果你需要所有do_step_one()的结束,你需要以下内容:
#pragma omp parallel for
for(unsigned int i=0; i<N; i++){
do_step_one(i);
}
#pragma omp parallel for
for(unsigned int i=0; i<N; i++){
do_step_two(i);
}
这样做的结果将是第一个的并行性,然后是第二个的并行性。