2

配列 W の合計プレフィックスを持つために、omp を使用してリストランキングの問題 (ショートカットによっても知られる) を実装しようとしています。flush プラグマを正しく使用しているかどうかはわかりません。領域は、ワークシェアリング、クリティカル、順序付き、マスター、または明示的なタスク領域内に密接にネストすることはできません"

#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");

}

助けてください!

4

1 に答える 1

5

omp parallel for 内でバリアを使用することはできません。ほとんどの場合、omp parallel 領域内でのみバリアを使用できます。

この理由は、ループが 1 から N の場合、内部のバリアが N スレッドを効果的に作成し、N が大きい場合にパフォーマンスに悪影響を与えるためです。

ここではアルゴリズムを調べませんでしたが、2 つの合理的な選択肢は、バリアがある場所で 2 つの並列 for ループを次々に使用するようにリファクタリングするか、#pragma parallel 領域を使用するようにアルゴリズムをリファクタリングすることです。

リストランキングアルゴリズムを調べました.openmpを使用する必要がある場合は、プレフィックスサムまたはスキャンの実装を見つけることができます.

-リック

于 2009-12-25T08:02:10.087 に答える