Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在线程迭代次数不相等的while循环中使用omp屏障_C_Multithreading_Openmp - Fatal编程技术网

C 如何在线程迭代次数不相等的while循环中使用omp屏障

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

我正试图用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;
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");