C、C++の最適化について語るスレ 3
■ このスレッドは過去ログ倉庫に格納されています
0780デフォルトの名無しさん
2012/11/17(土) 17:39:40.54その過程で分かったことを以下にまとめます。
間違っていないでしょうか?
■WindowsAPIやDirectXなどのAPIは、カーネルモードへの遷移が必要なため、
大きなオーバーヘッド(数千クロックオーダー)が生じる。
DirectXではドライバへのコマンドをある程度キューに蓄積しておき、
まとめて送ることでオーバーヘッドを低減している
■マルチタスクOSでは、単一のプロセッサでプロセスを切り替えて実行
(コンテキストスイッチング)させている。
これはマルチスレッドプログラムにおけるスレッドの切り替えでも発生する。
現代x86CPUはハードウェアによるコンテキストスイッチングを搭載しているにもかかわらず、
Windowsでは技術的な事情からソフトウェアによるコンテキストスイッチングを行っているため、
オーバーヘッドが大きい。
CPUに搭載されている物理コア数に応じたスレッド数を立ち上げて処理させる場合、
コンテキストスイッチングは(他プロセス(ここでは相対的に低負荷とする)との切り替えを除いて)
必要ないはずであるが、実際はコア数に比例したパフォーマンス向上が見られないことから、
なぜか不要なコンテキストスイッチングが働いている。
ちなみに、何千、何万というスレッドを扱うGPUではハードウェアによる1クロック切り替えを行っているので
オーバーヘッドはない。
■SIMD演算もマルチスレッドと同様に(粒度は異なるものの)並列演算手法の一つであるが、
コンテキストスイッチングが発生しないため、並列化数に比例した(場合によってはそれ以上)の
パフォーマンス向上が得られるため効率が良い。
■ このスレッドは過去ログ倉庫に格納されています