0

私は、主に配列に対する何千億回もの操作の繰り返しの中央ループで構成される物理シミュレーションをコーディングしています。これらの操作は他の操作とは独立しているため (実際には配列は途中で変更されます)、研究室の 4 コアまたは 8 コアのコンピューターで実行できるように、コードを並列化することを考えています。似たようなことをするのは初めてで、openmp を見るように勧められました。私はそれを使っていくつかのおもちゃのプログラムをコーディングし始めましたが、それがどのように機能するかについて本当に確信が持てず、ドキュメンテーションは私にとって非常に不可解です. たとえば、次のコード:

int a = 0;
#pragma omp parallel
  {
    a++;
  }
   cout << a << endl;

私のコンピューター(4コアCPU)で起動すると、4になることもあれば、3または2になることもあります。すべてのコアが命令を実行するのを待たないためですか?私の場合、何回の反復が行われたかを知る必要があるからです。最終的に何が欲しいかを考慮して、openmp以外のものを探す必要がありますか?

4

2 に答える 2

0

共有変数 (aコード内) に同時に書き込むと、データ競合が発生します。異なるスレッドが「同時に」書き込みを行うのを避けるには、アトミック割り当てを使用するか、割り当てをミューテックス(= 相互排除) で保護する必要があります。OpenMP では、後者はクリティカル リージョンを介して行われます。

int a = 0;
#pragma omp parallel
{
#pragma omp critical
  {
    a++;
  }
}
cout << a << endl;

(もちろん、この特定のプログラムは並行して何も実行しないため、同じことを実行するシリアル プログラムよりも遅くなります)。

詳細については、openMP のドキュメントを参照してください。ただし、C++ を使用している場合は、OpenMP ではなく TBB を使用することをお勧めします。それははるかに柔軟です。

于 2013-10-25T17:30:28.653 に答える