4

C# Parallel.For を使用して次の OpenMP コードに実装する方法

OpenMP コード

#pragma omp parallel
{
   float[] data = new float[1000];

#pragma omp for
   for(int i = 0; i < 500; i++)
   {
      for(int j = 0; j < 1000; j++)
      {
         data[j] =100;
      // do some computation using data
      }
   }
}

私も次のことを試しましたが、それは OpenMP コードが行うこととまったく同じではありませんでした。openMP コードでは、スレッドごとにメモリを割り当て、ネストされたループの計算を実行します。以下のコードは、実際にはスレッドごとではなく i ごとにメモリを割り当て、計算を実行します。

Parallel.For(0, 500, i =>
{
   float[] data = new float[1000];

   for(int j = 0; j < 1000; j++)
   {
       data[j] =100;
       // do some computation using data
    }
});
4

1 に答える 1

6

Parallel.Forスレッドごとの状態変数を格納できるようにするいくつかのオーバーロードを提供します。それらの1つは(ここで完全に説明されています):

public static ParallelLoopResult For<TLocal>(
    int fromInclusive,
    int toExclusive,
    Func<TLocal> localInit,
    Func<int, ParallelLoopState, TLocal, TLocal> body,
    Action<TLocal> localFinally
)

TLocalfloat[]あなたの場合など、任意のタイプにすることができ、localInit()関数はスレッドごとに1回呼び出され、スレッドのローカルストレージでそのタイプのインスタンスを初期化し、そのインスタンスが本体に渡されます。関数はbody状態を返す必要があり、次の反復に渡されます。

コードは次のようになります。

Parallel.For<float[]>(0, 500,
   () => new float[1000],
   (i, loop, data) =>
   {
      for(int j = 0; j < 1000; j++)
      {
         data[j] = 100;
         // do some computation using data
      }
      return data;
   },
   (data) => {}
);

Microsoft は、ここでこれを行う例を提供しています。

于 2013-10-11T11:32:56.973 に答える