2

OpenMP を使用して並列アルゴリズムに取り組んでいます。CPU 使用率から判断すると、私が書いた「シーケンシャル」コードの多くは、実際には並列で実行されています。

例えば:

#pragma omp parallel for if (par == "parallel")
for (int64_t u = 1; u <= n; ++u) {
    for (int64_t v = u + 1; v <= n; ++v) {
        ....
    }
}

フラグが設定されている場合、これは条件付きで並列です。フラグを設定すると、16 コアのマシンで 1500% の CPU 使用率が表示されます。フラグが設定されていない場合でも、250% の CPU 使用率が表示されます。

これは、自動並列化が行われているためだと思います。正しい?GCCはこれを行いますか?

順次実行時間と並列実行時間を比較する必要があるため、( など) の注釈が付けられていないコードは#pragma omp parallel...1 つの CPU のみで実行したいと考えています。これを簡単に達成できますか?自動並列化を切り替えて、OpenMP で明示的に注釈を付けた並列処理を実行できる GCC フラグはありますか?

4

1 に答える 1

2

OpenMPif句は、並行性に対してコンパイル時の制御ではなく、実行時の制御を実行することに注意してください。これはif、プログラムの実行時に句内の条件がfalseと評価される可能性がある一方parallelで、チーム内のスレッド数を1に設定することでリージョンを非アクティブ化する一方で、リージョンは引き続き複数のランタイム呼び出しとそのための個別の関数に拡張されることを意味します。ただし、これは並列実行にはつながりません。OpenMPランタイムは、OpenMPスレッドの実行中のプールをビジー状態に保つ可能性もあります-タスクを待機します。

OpenMPコードが明らかにシリアル実行可能ファイルとしてコンパイルされることを保証する唯一の方法(並列ライブラリにリンクしていない場合)は、OpenMPサポートを無効にしてコンパイルすることです。あなたの場合、それは-fopenmpコードがコンパイルされている間、GCCにオプションが与えられないことを意味します。

于 2013-01-31T17:43:24.893 に答える