0

openmp 並列構造を使用する C++ アプリケーションがあります。

for ループ内のメソッドは大量のメモリを使用します。開始時にメモリを割り当て、最後に解放します。

システムに十分なメモリがある場合は正常に動作しますが、十分なメモリがない場合、操作は失敗します。

ターゲット システムに十分なメモリがあるため、2 つのスレッドしか並列に実行できないか、3 つのスレッドを並列に実行できます。

使用可能なメモリに基づいて使用する必要があるスレッドの数がわかるように、openmp を構成する方法はありますか?

OpenMP でこれができない場合、自分でできる方法はありますか?

4

1 に答える 1

1

OpenMP は、メモリ使用量の監視に関しては非常に愚かであり、自分で実装する必要があります。適切な戦略は、データを同時に処理できるスレッド数の上限を取得するために、使用可能なメモリの量を取得し、それをスレッドごとのメモリ要件で割ることです。その数がわかったら、句parallelを使用してその数のスレッドで領域を強制的に実行できます。num_threads

int max_threads = mem_size / mem_per_thread;

#pragma omp parallel for num_threads(max_threads)
for (...)
{
}

ここで難しい問題は、使用可能なメモリの量を取得する方法です。特に、ほぼすべての最新のオペレーティング システムが仮想メモリを実装していることを考えると、なおさらです。解決策の 1 つは、それをエンド ユーザーに任せることです。たとえば、ユーザーが妥当と考える特定の値に設定できるパラメーターをプログラムの構成に提供します。別の戦略として、値を物理メモリ サイズの特定の % に設定することもできます。

于 2013-09-09T15:05:40.490 に答える