ソフトウェア・ベースのスペキュレーティブ・プリコンピュテーション (SSP) は、ヘルパー・スレッディング最適化とも呼ばれ、データ・プリフェッチを動的に行うヘルパースレッドを作成することで、一部のプログラムのパフォーマンスを向上させる最適化手法です。
SSP は、プログラムのパフォーマンスがデータ・キャッシュ・ミス、特に pointer-chasing ループの影響を受けるプログラムに対して有効です。データのプリフェッチは、メインメモリーにアクセスするのに生じる長いレイテンシーの影響を軽減します。生成されたコードは、ハイパースレッディング・テクノロジー インテル(R) Pentium(R) 4 プロセッサーのような、共有データキャッシュとマルチスレッド機能が有効なハードウェア上で実行する必要があります。
Mac OS*: SSP はサポートされていません。また、このトピックにリストされている関連オプションも利用できません。
SSP は、IA-32 アーキテクチャー用コンパイラーでのみ利用できます。SSP は、メインの計算スレッドと並列な別のヘルパースレッドで、オリジナルプログラム命令のサブセット (スライス) を直接実行します。ヘルパースレッドはメインスレッドに先行して実行され、先にメモリーアクセスのアドレスを計算して、初期のキャッシュミスをトリガーします。この動作は、メインスレッドからメモリー・レイテンシーを隠蔽します。
SSP を有効にするコマンドライン・オプションは、-ssp (Linux*) または /Qssp (Windows*) です。SSP は、代表的なデータセットを使用してアプリケーションを実行し、プロファイル・フィードバック情報を生成した後に実行する必要があります。
SSP を有効にして起動すると、コンパイラーは次の処理を行います。
delinquent ロードの識別: コンパイラーは、フィードバック情報を調べて、トップのキャッシュ・ミス・ロード (delinquent ロードと呼ばれます) を識別します。
ループ選択: コンパイラーは、スペキュレーティブ・ロードが役立つコードの領域を識別します。delinquent ロードは、通常、極度にトラバースされたループ入れ子内で発生します。
プログラムのスライス: 各領域内で、コンパイラーは個々の delinquent ロードを確認して、delinquent ロードのアドレスを計算するために必要なコードのスライスを特定します。
ヘルパー・スレッド・コード生成: コンパイラーは、スライス用のコードを生成します。さらに、コンパイラーは、ヘルパースレッドをランタイム時に起動してスケジュールするコードを生成します。
プロファイリングおよびプロシージャー間の最適化とともに SSP を使用すると、一部のプログラムでパフォーマンスが低下することがあります。これらの手法を使用する前に、SSP を使ったテストを行い、ターゲットのアプリケーションにおける SSP の影響をよく確認してください。SSP を使用すると、コンパイル時間も長くなります。
SSP 最適化には、いくつかのステップが必要です。以下に、SSP 最適化を行う一般的な手順を示します。
次の例では、ソースファイル a1.cpp, a2.cpp and a3.cpp をコンパイルして実行ファイル go (Linux) または go.exe (Windows) を生成します。
-prof-gen (Linux) または /Qprof-gen (Windows) オプションを使用してアプリケーションをコンパイルし、下記の例に示すように、インストルメント済みコードを含む実行ファイルを生成します。
プラットフォーム |
コマンド例 |
---|---|
Linux |
icpc -prof-gen a1.cpp a2.cpp a3.cpp -o go |
Windows |
icl /Qprof-gen a1.cpp a2.cpp a3.cpp /Fego |
このステップで使用されているオプションに関する詳細は、次のトピックを参照してください。
-prof-gen コンパイラー・オプション
代表的なデータセットを使用してインストルメント済みプログラムを実行し、動的プロファイル情報ファイルを生成します。
プラットフォーム |
コマンド例 |
---|---|
Linux |
go |
Windows |
go.exe |
インストルメント済みプログラムを実行すると、拡張子が .dyn の動的プロファイル情報ファイルが生成されます。入力データを変更して、プログラムを複数回実行できます。後のステップで、コンパイラーはすべての .dyn ファイルを 1 つの .dpi ファイルにマージします。
-prof-gen-sampling と -prof-use (Linux)、/Qprof-gen-sampling と /Qprof-use (Windows) オプションを使用してアプリケーションを再コンパイルし、実行ファイルを生成して、PMU 用にアプリケーションを準備します。この実行ファイルは、ハードウェア・パフォーマンス・モニタリング・ユニット (PMU) から情報を収集できます。
次のコマンド例は、コンパイル中のオプションの組み合わせを示しています。
プラットフォーム |
コマンド例 |
---|---|
Linux |
icpc -prof-gen-sampling -prof-use -O3 -ipo a1.cpp a2.cpp a3.cpp -o go |
Windows |
icl /Qprof-gen-sampling /Qprof-use /O3 /Qipo a1.cpp a2.cpp a3.cpp /Fego |
このステップで使用されているオプションに関する詳細は、次のトピックを参照してください。
-prof-gen-sampling および -prof-use コンパイラー・オプション
profrun ツールを使用して代表的なデータセットでアプリケーションを再度実行し、delinquent ロード情報を含むハードウェア・プロファイル情報ファイルを作成します。
プラットフォーム |
コマンド例 |
---|---|
Linux |
profrun -dcache go |
Windows |
profrun -dcache go.exe |
このステップでは、アプリケーションを実行して、ハードウェア・プロファイル情報を含むファイルを生成します。ファイルはローカル・ディレクトリーに生成されます。拡張子は .hpi です。入力データを変更して、プログラムを複数回実行できます。すべての実行のハードウェア・プロファイル情報が自動的にマージされます。
-prof-use と -ssp (Linux)、/Qprof-use と /Qssp (Windows) オプションを使用してアプリケーションをコンパイルし、SSP 最適化が有効な実行ファイルを生成します。
次のコマンド例は、コンパイル中のオプションの組み合わせを示しています。
プラットフォーム |
コマンド例 |
---|---|
Linux |
icpc -prof-use -ssp -O3 -ipo a1.cpp a2.cpp a3.cpp -o go |
Windows |
icl /Qprof-use /Qssp /O3 /Qipo a1.cpp a2.cpp a3.cpp -o go |
このステップで使用されている -ssp (Linux) または /Qssp (Windows) オプションに関する詳細は、コンパイラー・オプションの次のトピックを参照してください。
-ssp コンパイラー・オプション
最後のステップでは、インストルメント済みプログラムの実行フェーズにおけるフィードバックとプロファイリングの実行フェーズにおけるキャッシュミス情報を使用し、SSP を有効にしてソースファイルをコンパイルおよびリンクします。
SSP はプロファイリングおよびサンプリング・フィードバック・ベースの最適化のため、コンパイラーが delinquent ロードを発見できない場合、またはヘルパースレッドを使用することによって得られるパフォーマンス・ゲインがほとんどない場合、コンパイラーは SSP 固有のコードを生成しません。この場合、コンパイラーは SSP ステータスメッセージを生成しません。
「プロファイルに基づく最適化の概要」を参照してください。