Intel Sandybridge ファミリ CPU のパイプライン用プログラムの逆最適化
はじめに
タスクは、Intel Sandybridge を利用してモンテカルロ シミュレーション プログラムの効率を下げることです。プロセッサアーキテクチャ。このプロセッサには、レジスタの名前変更やストア バッファリングなどの機能を備えたアウトオブオーダー パイプラインが搭載されているため、命令レベル並列処理 (ILP) を削減し、ハザードを引き起こすことが困難になっています。
プログラム分析
このプログラムは、ヨーロッパのバニラ コールおよびプット オプションの価格を計算するモンテカルロ シミュレーションです。プログラムの主なコンポーネントは次のとおりです:
- 指定された回数繰り返すループ
- ガウス乱数生成
- ブラック・ショールズのオプション価格計算式
最適化手法
次の手法を使用すると、プログラムの効率が低下します:
-
偽の依存関係: 命令間に不要な依存関係を導入して、ハザード ストールを増加させます。
-
メモリのボトルネック: キャッシュ ミスとメモリ アクセスの原因データの位置ずれや、不連続なメモリ アクセス パターンの使用による遅延。
-
遅延命令: 遅延が長く、パイプラインによって遅延できる命令を使用します。
-
効率性の低い演算: 代わりに、除算などの効率性の低い数学演算を使用します。
-
分岐の予測ミス: パイプライン フラッシュを引き起こす予測不可能な分岐を導入します。
-
ストア転送のストール: double の上位バイトの XOR 演算などの手法を使用します。ストア転送を引き起こす
-
命令キャッシュ ミス: ルーチンを小さなチャンクに分割して命令キャッシュ ミスを引き起こします。
具体的な提案
上記の手法に基づいて、状況を悲観するための具体的な提案をいくつか示します。プログラム:
- std::atomic を使用します。 for ループ カウンターとそれらの位置がずれている。
- 非アトミック変数間で偽共有を誘発する。
- 単一の共有 std::atomic ループ カウンターを使用したマルチスレッド。
- 結合/分配等価物を使用して式を書き換えて増やす
- パイプラインの停止を避けるために組み込み関数を慎重に使用してください。
- インライン アセンブリを使用して uop キャッシュを分割します。
- CPUID/RDTSC を使用して各反復の時間を計測し、シリアル化を誘導します。 .
- 配列を不連続な順序で走査し、パディング付きの配列を使用し、要素の位置がずれています。
- 待ち時間を増やすには、float の代わりに double 精度を使用します。
- 整数から float への変換を強制的に行い、再度その逆を行います。
-
-O0 でコンパイラの最適化を無効にし、低速な命令には -march=i386 を使用します。
- 異なる CPU への CPU アフィニティを頻繁に設定します。
以上がインテル Sandybridge プロセッサーのモンテカルロ シミュレーションを再最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。