あまりパソコンに詳しい方ではありません。
今、linuxが入ったパソコン(CPU:Intel(R)Core(TM)i7 CPU970@3.20GHz,コア数12,
メモリ:5.8GiB)で数値計算をしています。コンパイラはgfortranです。OpenMPを使って、並列計算をしています。
例えば、スレッドを5使って一つのプログラムの計算したとします。次に別のプログラムをスレッドを5使って同時に計算したとします。
CPUモニタで確認すると、合計12スレッド中、10スレッドが使用率100%になります。
しかし、計算時間はそれぞれ倍ぐらいになってしまいます。結局、プログラムを1
つずつ計算するのと同じ時間がかかります。また、使用するスレッドは5ぐらいが最適であることがわかっています。(それ以上多くしても計算時間が多くなるだけ)。つまり、12スレッド中7スレッドは常に仕事をしていません。
原因、及び解決方法はあるでしょうか?
No.2ベストアンサー
- 回答日時:
各スレッドで個別に使う変数をPRIVATEに指定してありますか?
CRITICALとかBARRIER等の制御を使っていませんか?
並列計算は、各スレッドが独立している(他のスレッドと関係が無い)ほど効率がよくなります。
OpenMPでは、PRIVATEに指定していない変数はSHARED扱いになり、各スレッドで共有しようとするので、独立性が落ちます。
CRITICAL等の制御は必要なケースもありますが、他のスレッドを待ったりするために効率が落ちるので、最低限の利用に留める(できれば使わずに済むアルゴリズムにする)必要があります。
No.1
- 回答日時:
メモリアクセスが多くなるとメモリアクセスが足を引っ張りますのでマルチCPUの効果が薄れると思います。
なので各スレッドは出来るだけ狭いメモリ領域を参照することが望ましいです(256KBを超えるランダムアクセスは低速化の要因)。一番良いのは計算が複雑で変数や配列アクセスが極力少ないコードです。
あとCorei7 970だと実コア数は6で、倍の12に見えるのはハイパースレッディングの機能ですがプログラムの組み方次第ではハイパースレッディングでは効率的には動きません。場合によってはハイパースレッディングを切ってコア6で動かしたほうが早いかも知れません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(ソフトウェア) F-BASICで計算中の実行が中途で勝手に止まり、大変困っています。 2 2023/03/02 16:15
- C言語・C++・C# 1. 仮想CPU「exmini」を使用して,「$dataからn減算する」プログラムを作成してください 2 2022/07/04 17:49
- CPU・メモリ・マザーボード PCスペック(CPUとGPUのバランス)について ボトルネックチェッカー (https://babl 3 2022/10/30 15:33
- C言語・C++・C# C言語 3 2022/10/04 15:07
- その他(自然科学) 論文のまとめに関して(小論文)添削お願いします。 6 2023/07/16 14:24
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- 仕事術・業務効率化 給料計算はシステムを使用してればて計算は不用ですか? 時間の計算を電卓を使用して計算する必要あります 2 2023/04/05 14:34
- 計算機科学 科学計算においてワークステーションを使うのはなぜ? 7 2023/02/16 19:21
- C言語・C++・C# numpyスライス機能を使った数値計算 2 2023/05/08 16:01
- CPU・メモリ・マザーボード CPUについて 4 2022/07/09 13:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マイクロソフトedge で5チャン...
-
スレッドの監視方法
-
メモリアクセスの競合について
-
C言語で一定時間待機後、再実行
-
pthread_attr_tへの値の代入に...
-
WaitForSingleObjectの使い方に...
-
別スレッドのデータを受信できない
-
アラート可能な待機状態とは
-
マルチスレッドプログラミング...
-
DirectX 11のConsntanBuffer
-
VB2005 シリアル通信のClose処理
-
Macターミナルで実行中のプログ...
-
VBAの配列サイズとメモリに関して
-
なんかC言語でプログラム書いて...
-
VBSの処理中一旦処理を止めて再...
-
プログラミング ソースコード
-
DoEvents関数って何?
-
MACで動く実行ファイルをWindow...
-
Webプログラムってネイティブア...
-
COMBOBOXで日付入力
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
WaitForSingleObjectの使い方に...
-
スレッドにて同一メモリの書き...
-
VC++スレッドの正しい終了のさ...
-
スレッドの監視方法について
-
Windows上で、シグナル(SIGTERM...
-
スレッドの終了の仕方
-
スレッドの安全な終了のさせ方
-
CWnd::OnTimerのスレッドの取得
-
MFC通信プログラムマルチスレッ...
-
Linuxでスレッド優先度って変え...
-
.netアプリへのSendMessageでフ...
-
VB2005 シリアル通信のClose処理
-
別スレッドからメインダイアロ...
-
マルチスレッドについて
-
スレッドの終了はどうやるんで...
-
マルチスレッドプログラミング...
-
別スレッドのデータを受信できない
-
特定のスレッドの破棄
-
msec単位のWait Timerが作れない!
-
C# スレッド終了の監視について
おすすめ情報