C Openmp并行内同步

C Openmp并行内同步,c,multithreading,parallel-processing,synchronization,openmp,C,Multithreading,Parallel Processing,Synchronization,Openmp,我需要这样做 #pragma omp parallel{ #pragma omp for for_1(){ for_2(){ do_something(); } #pragma omp barrier //wait for all threads to finish after the inner for continue_with_something_else_in parallel(); } } 编译器告诉我不能在那里设置障碍。有人知道我如何解决

我需要这样做

#pragma omp parallel{

#pragma omp for
for_1(){

   for_2(){
     do_something();
   }
   #pragma omp barrier //wait for all threads to finish after the inner for

   continue_with_something_else_in parallel();

}

}

编译器告诉我不能在那里设置障碍。有人知道我如何解决这个问题吗?

也许这个链接可以帮助您:

据我所见:

omp barrier指令必须出现在块或复合语句中。例如:

if (x!=0) {
   #pragma omp barrier    /* valid usage    */
}
if (x!=0)
   #pragma omp barrier    /* invalid usage  */

也许此链接将帮助您:

据我所见:

omp barrier指令必须出现在块或复合语句中。例如:

if (x!=0) {
   #pragma omp barrier    /* valid usage    */
}
if (x!=0)
   #pragma omp barrier    /* invalid usage  */

我知道这是一个老帖子,但既然我发现了它,其他人也可能

解决方案: 说明: OpenMP在“块”中为循环调度
,并将它们分配给线程,这意味着在一个循环迭代中设置
障碍
将是有问题的,因为等待的同一线程可能也会被分配一些其他循环迭代,因此它将在死锁状态下等待自己


但是OpenMP标准确实保证,如果您使用
调度(静态)
,单个
并行体中的相同线程将被分配相同的循环迭代,并且可以高效地共享内存,这就是我所做的。

我知道这是一篇老文章,但由于我发现了它,其他人也可能

解决方案: 说明: OpenMP在“块”中为
循环调度
,并将它们分配给线程,这意味着在一个循环迭代中设置
障碍
将是有问题的,因为等待的同一线程可能也会被分配一些其他循环迭代,因此它将在死锁状态下等待自己


但是OpenMP标准确实保证,如果您使用
调度(静态)
,单个
并行体中的相同线程将被分配相同的循环迭代,并且可以高效地共享内存,这就是我所做的。

编译器是正确的(通常是正确的)。如果不同的线程在for循环中进行不同数量的迭代,它们将遇到不同数量的障碍-这将如何工作?您可以研究使用
flush
来确保所有线程都有一个共享变量的公共视图,但是考虑到并行for循环中的内容应该是独立的,我对任何要求它们在内部for循环之后有一个公共内存视图的算法深表怀疑,这同样,并非所有线程都将执行相同的次数。你到底想干什么?好吧,我现在明白了。事情是修改一些共享数组的内部,在屏障之后,所有线程都需要使用这些数组的值。所以,也许flush指令可以工作?这是可能的,但是请仔细阅读文档;flush并不总是按照您的想法执行。编译器是正确的(通常是正确的)。如果不同的线程在for循环中进行不同数量的迭代,它们将遇到不同数量的障碍-这将如何工作?您可以研究使用
flush
来确保所有线程都有一个共享变量的公共视图,但是考虑到并行for循环中的内容应该是独立的,我对任何要求它们在内部for循环之后有一个公共内存视图的算法深表怀疑,这同样,并非所有线程都将执行相同的次数。你到底想干什么?好吧,我现在明白了。事情是修改一些共享数组的内部,在屏障之后,所有线程都需要使用这些数组的值。所以,也许flush指令可以工作?这是可能的,但是请仔细阅读文档;同花顺并不总是做你想做的事。嗯,那是什么意思?屏障在并行范围内,但当我编译时,我得到了以下错误:屏障区域可能没有紧密嵌套在工作共享、关键、有序、主任务或显式任务区域内。编译器说明了一切:屏障区域可能不在工作共享任务内#pragma omp for是一个工作共享任务。看看我在“#pragma omp for”上发布的链接,我想我现在明白了。谢谢嗯,那是什么意思?屏障在并行范围内,但当我编译时,我得到了以下错误:屏障区域可能没有紧密嵌套在工作共享、关键、有序、主任务或显式任务区域内。编译器说明了一切:屏障区域可能不在工作共享任务内#pragma omp for是一个工作共享任务。看看我在“#pragma omp for”上发布的链接,我想我现在明白了。谢谢