我正在尝试使用omp实现listnanking问题(通过快捷方式已知)以获得数组W的前缀。 我不知道我是否正确使用了冲洗的pragma .. 当编译“障碍区域可能不会紧密嵌套在工作共享,关键,有序,主要或显式任务区域内”时,我会发出警告
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <omp.h>
main(int argc, char *argv[])
{
int Q[9]={1,2,3,4,5,6,7,8,0};
int W[8]={1,2,3,4,5,6,7,8};
int i,j=6,id;
printf("Before:\n");
for(j=0;j<8;j++)
printf("%d",W[j]);
printf("\n");
#pragma omp parallel for shared(Q,W) private(id) num_threads(7)
for (i=6; i>=0; i--)
{
id= omp_get_thread_num();
while((Q[i] !=0)&& (Q[Q[i]] !=0))
{
#pragma omp flush(W)
W[i]=W[i]+W[Q[i]];
#pragma omp flush(W)
printf("Am %d \t W[%d]= %d",id,i,W[i]);
#pragma omp barrier
#pragma omp flush(Q)
Q[i]=Q[Q[i]];
#pragma omp flush(Q)
printf("Am %d \n Q[%d]= %d",id,i,Q[i]);
};
}
printf("Result:\n");
for(j=0; j<8; j++)
printf("%d \t",W[j]);
printf("\n");
}
PLEAAAAAAAAAAAASE帮助!
答案 0 :(得分:4)
你不能在omp平行区域内使用障碍物,你几乎只能在omp平行区域内使用障碍物。
原因是因为如果你的循环从1到N,那么内部的障碍将有效地创建N个线程,如果N很大,这将产生负的影响。
我没有在这里查找算法,但是两个合理的选择是重构使用2个并行for循环,一个接一个地使用障碍,或者重构算法以使用#pragma并行区域。
我查找了列表排名算法,如果你必须使用openmp,你将很好地找到前缀sum或scan的实现。
-Rick