如何在while循环上使用omp barrier,而线程没有相同的迭代次数

时间:2009-12-24 21:10:57

标签: c multithreading openmp

我正在尝试使用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帮助!

1 个答案:

答案 0 :(得分:4)

你不能在omp平行区域内使用障碍物,你几乎只能在omp平行区域内使用障碍物。

原因是因为如果你的循环从1到N,那么内部的障碍将有效地创建N个线程,如果N很大,这将产生负的影响。

我没有在这里查找算法,但是两个合理的选择是重构使用2个并行for循环,一个接一个地使用障碍,或者重构算法以使用#pragma并行区域。

我查找了列表排名算法,如果你必须使用openmp,你将很好地找到前缀sum或scan的实现。

-Rick