2017-01-05 4 views
0

私はOpenMPプログラムを書いて、2つのコアマシンで実行しました。Openmpスレッドアフィニティ:プログラム内に2つのスレッドを設定し、実行中のコア数はいくつですか?

スレッド番号を1から2に、2から4に変更したとき、2倍のスピードを得ることができませんでした。

2つのスレッドを4つのスレッドにすると、ハイパースレッドになります。 Hyperthreadsは一般的にリソースの制限のために2倍のスピードを上げることはできません。

しかし、1スレッドから2スレッドまで、2倍のスピードを得ることはできません。私はこれについて混乱しています。私はCPUアフィニティコンセプトを検索して見つけましたが、OpenMPの仕組みを理解できません。

2つのスレッドを使用すると、Openmp静的スケジュールは2つのスレッドを1つのコアまたは2つのコアに配置しますか?戻り値が0または1であることから

OMP_GET_THREAD_NUM()関数は、私に答えを言うことはできませんが、私は、彼らは1つのコアまたはヘルプ2.

おかげで実行されているかわかりません。

閉じる enter image description here

スプレッド enter image description here

マスター私は、これはあなたが動作するように適切なオプションを選択に役立つことを願っています enter image description here

+0

コードなしでは、私たちは何が起こっているのかほとんど推測できないので、答えにくいです。まず、omp_get_thread_num()はスレッド識別子を返します。スレッド1は0を返し、スレッド2はスレッド1を返します。 – Taron

+0

ハイパースレッディングにもかかわらず2つのスレッドを別々のコアに割り当てる通常の方法は、omp_places = coresです。あなたのopenmpがこれをサポートしていない場合は、すべてのコアをフルに活用するために、コアより多くのスレッドが必要な場合があります。 – tim18

+0

スレッド2が実行されているコアは、どのコアが実行中であるのかを調べるためのコードを書くことができますか? –

答えて

1

proc_bindでスレッド・アフィニティーを使用することができます。

+0

ありがとう、ルスラン。 OpenMPのスレッドアフィニティを使用しようとしていますが、LinuxでOpenmPの環境変数を設定するのは簡単ですが、WindowsプラットフォームではVSでは動作しません。 –

+0

インテル®コンパイラーを使用している場合は動作します。 VSからのコンパイラは、OpenMP 2.0のみをサポートしています。インテルWebサイトのこのリンクには、この情報があります。https://software.intel.com/en-us/node/522691 –

+0

ありがとう、ルスラン。コンパイラをVC++からIntelに変更し、proc_bind設定を使用できるようにしました。 –

関連する問題