【发布时间】:2012-11-07 20:55:40
【问题描述】:
我需要做这样的事情
#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();
}
}
编译器告诉我不能在那里设置障碍。有谁知道我该如何解决这个问题?
【问题讨论】:
-
编译器是正确的(通常是这样)。如果不同的线程在 for 循环中执行不同数量的迭代,它们将遇到不同数量的障碍——这将如何工作?你可以考虑使用
flush来确保所有线程对共享变量有一个共同的看法,但是考虑到并行 for 循环中的东西应该是独立的,我对任何需要它们的算法都深表怀疑内部 for 循环之后的内存的常见视图,同样,并非所有线程都会执行相同的次数。你到底想做什么? -
好的,我现在明白了。事情是修改一些共享数组的内部,并且在屏障之后所有线程都需要使用这些数组的值。
-
那么也许flush指令可以工作?
-
有可能,但请仔细阅读文档;冲洗并不总是如您所想。
标签: c multithreading parallel-processing synchronization openmp