0

次のスタイルのコードがあります。

for (set=0; set < n; set++)  //For1
{
   #pragma omp parallel for num_threads(x)
    for (i=0; i < m; i++)   //For2: this loop can be executed in parallel
   {
      commands...
   }

   for (j=0; j < m; j++)   //For3: this loop depends on the output of the For2 and also should be executed in a sequential way
   {
     commands...
   }

}

お気づきのように、n 個の独立したセット (外側のループ、つまり For1) があります。各 Set は、並列ループ (For2) と、For2 の後に実行されるシーケンシャル セクション (For3) で構成されます。

For2の並列化には「#pragma omp parallel for num_threads(x)」を既に使用しています。

ここで、外側のループ (For1) も並列にしたいと考えています。つまり、各 Set を並行して実行したいのです。

openmpでそれがどのように可能かを教えていただければ幸いです。

1 つの方法は、各セットに対応する n 個のスレッドを作成することです。それが正しいか?しかし、openmp 機能を完全に使用する別の方法があるかどうか疑問に思っていますか?

前もって感謝します。

4

3 に答える 3

0

セットの数によっては、外側のループを単純に並列化することが最適なオプションであることがわかります。コンピューターにコアの数よりも多くのコアがある場合は、スレッド作成のオーバーヘッドがはるかに少ないため、内側のループを並列化するよりも高速になる可能性があります。

操作が CPU バウンドで、外側のループが並列化されていると仮定すると、コンピューターのすべてのコアを完全に使用できます。さらに内側のループを並列化しようとしても、すべてのリソースがすべて使用されている場合は高速にはなりません。

使用可能なコアよりもセットが少ない場合は、内側のループを並列化すると、使用可能なすべての計算能力を既に消費している可能性が高くなります。

両方のループを本当に並列化したい場合は、MPIを検討し、複数のコンピューターでハイブリッド並列化を行う必要があります。外側のループは複数のコンピューターで並列化され、内側のループは 1 台のコンピューターのすべてのコアで並列化されました。

于 2013-11-07T10:29:35.433 に答える