我需要做这样的事情
#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();
}
}
编译器告诉我,我不能在那里设置障碍。有谁知道我怎么解决这个问题?
答案 0 :(得分:4)
我知道这是一个老帖子,但是因为我发现其他人可能也是......
#pragma omp parallel
{
#pragma omp for schedule(static)
for_1() {
for_2() {
do_something();
}
}
// note implicit barrier after for construct
#pragma omp for shedule(static)
for_1() {
continue_with_something_else_in parallel();
}
}
OpenMP在" chunks"中安排for
循环并将它们分配给线程,这意味着在一个循环迭代中有一个barrier
会有问题,因为正在等待的同一个线程也可能被分配了一些其他的循环迭代,所以它会在陷入僵局的状态中等待自己。
但是OpenMP标准确实保证如果你使用schedule(static)
,单个parallel
主体中的相同线程被分配相同的循环迭代并且可以有效地共享内存,这就是我所做的。已完成。
答案 1 :(得分:0)
也许这个链接可以帮到你:
从我看到的内容:
omp barrier指令必须出现在块或复合语句中。例如:
if (x!=0) {
#pragma omp barrier /* valid usage */
}
if (x!=0)
#pragma omp barrier /* invalid usage */