チュートリアルのこのステージでは、ソースコードを編集し、アプリケーションを再コンパイルして、メインメモリーのアクセスのボトルネックを解決します。
このチュートリアルでは、インテル® C++ コンパイラー・クラシックが使用されています。結果とワークフローは、使用するコンパイラーによって異なる場合があります。
チュートリアルのこのステージでは、コンパイラーの最適化レベルを 「最大最適化 (スピード優先) (-O2)」 ではなく 「最大最適化 (サイズ優先) (-O1)」 に設定します。
スピードを優先する最大限の最適化を有効にしてパフォーマンス・プロファイルを行うことは理にかなっています。ここではこれを基に、インテル® VTune™ プロファイラーがコンパイラー・オプションによる不明瞭な動作に関連する問題の検出にどのように役立つかを説明します。インテル® C++ コンパイラー・クラシックでは、-O1 オプションは自動ベクトル化を無効にします。
このような問題は、実際の大規模プロジェクトで発生する可能性があり、その理由は、タイプミスのような単純なものから、特定のコンパイラー・ オプションがパフォーマンスにどのように影響するか認識が不足しているなど、より複雑なものまで多岐にわたります。
例えば、 gcc などの一部のコンパイラーは、 -ftree-vectorize オプションが指定されない限り、 -O2 レベルでベクトル化を試行せず、 -O3 レベルでのみ自動ベクトル化を行います。
インテル® oneAPI DPC++/C++ コンパイラーを使用して修正および再コンパイルするには、次の手順に従います。
‘/opt/intel/oneapi/compiler/latest/env’ フォルダーで、次のコマンドを実行してコンパイラー環境変数を設定します。
source env.vars
マシン上の matrix サンプル・アプリケーションのフォルダーを見つけます。デフォルトは以下です。
$HOME/intel/vtune/samples/matrix
任意のテキストエディターを使用して、’../matrix/linux/’ フォルダーにある makefile を開きます。
42 行目を以下のように変更します。
CFLAGS = -g -O3 -fno-asm
変更後:
CFLAGS = -g -O1
43 行目を以下のように変更します。
OPTFLAGS = -xSSE3
変更後:
OPTFLAGS =
makefileを保存して閉じます。
‘../matrix/src’ フォルダーにある multiply.h ヘッダーファイルをテキストエディターで開きます。
36 行目を以下のように変更します。
#define MULTIPLY multiply1
変更後:
#define MULTIPLY multiply2
これにより、プログラムは multiply.c ソースファイルの multiply2 関数を使用するように変更され、メモリーアクセスの問題を解決するループ変換テクニックが適用されます。
multiply.h ファイルを保存して閉じます。
‘../matrix/linux’ フォルダーに移動し、次のコマンドを使用してアプリケーションを再コンパイルします。
make icc
次のステップ: 最適化後のパフォーマンスを解決します。