我有两个功能,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);
}
Run Code Online (Sandbox Code Playgroud)
的每次调用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);
}
Run Code Online (Sandbox Code Playgroud)
但是gcc抱怨道
convolve_slices.c:21:警告:屏障区域可能不会紧密嵌套在工作共享,关键,有序,主要或显式任务区域内.
我有什么误解?如何解决这个问题?
Jas*_*son 11
只是旁注,如果要确保不重新创建线程,请将parallel的声明和声明分开:
#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);
}
}
Run Code Online (Sandbox Code Playgroud)
我看到这段代码的一个问题是该代码不符合规范:)
如果您需要结束所有 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);
}
Run Code Online (Sandbox Code Playgroud)
其结果将是第一个 for 的并行性,然后是第二个 for 的并行性。
| 归档时间: |
|
| 查看次数: |
7313 次 |
| 最近记录: |