C 如何在线程迭代次数不相等的while循环中使用omp屏障
我正试图用omp实现listranking问题(也称为shortcutting),以使数组W的前缀和为前缀。 我不知道我是否正确使用了flush pragma。。 我在编译时有一个警告:“障碍区域可能不会紧密嵌套在工作共享、关键、有序、主任务或显式任务区域中”C 如何在线程迭代次数不相等的while循环中使用omp屏障,c,multithreading,openmp,C,Multithreading,Openmp,我正试图用omp实现listranking问题(也称为shortcutting),以使数组W的前缀和为前缀。 我不知道我是否正确使用了flush pragma。。 我在编译时有一个警告:“障碍区域可能不会紧密嵌套在工作共享、关键、有序、主任务或显式任务区域中” #包括 #包括 #包括 #包括 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; p
#包括
#包括
#包括
#包括
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(“之前:\n”);
对于(j=0;j=0;i--)
{
id=omp_get_thread_num();
而((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 flush(Q)
Q[i]=Q[Q[i]];
#pragma omp flush(Q)
printf(“Am%d\n Q[%d]=%d”,id,i,Q[i]);
};
}
printf(“结果:\n”);
对于(j=0;j您不能在omp并行区域内使用屏障,对于,您几乎只能在omp并行区域内使用屏障
这样做的原因是,如果循环从1到N,那么内部的屏障将有效地创建N个线程,如果N很大,这将对性能产生负面影响
我没有在这里查找算法,但有两个合理的选择:重构以使用2个并行循环,一个接一个地用于障碍所在的循环,或者重构算法以使用#pragma并行区域
我查阅了列表排序算法,如果您必须使用openmp,您将很好地找到前缀和或扫描的实现
-Rick谢谢Rick,我注意到不需要在循环中使用屏障。在修改Q[i]和W[i]的值后,我放入了#pragma omp flush(Q)和#pragma omp flush(W),但当另一个线程在另一个线程更改其Q[i]之前进行刷新时,我仍然存在一个问题value.maya如果您在windows上,请查看VS2010中的并行模式库,我们在code.msdn.com/concrtextras上实现了前缀扫描作为示例。如果您不在windows上,则Intel的线程构建块已实现扫描。您还可以查看示例并将Parallel_for替换为openmp for。
#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");