インテル® Advisor ユーザーガイド
インテル® Advisor の特殊なアノテーションはすべて、メモリーアクセスを詳しく観測する依存関係ツールによって認識されます。これらのアノテーションの中には、依存関係ツールがすべてのまたは特定のデータ共有問題をレポートするのを妨げるものがありますが、ストレージの使用を観測するアノテーションは、メモリーアクセスの詳細を提供します。
以下に示す C/C++ 構文では、addresses と sizes は、C++ 表現です。同様に、Fortran の var は Fortran の整数アドレスです。
このトピックでは、次のアノテーションについて説明します。
並列フレームワーク・コードを追加する際に、インダクション変数 (++i など) を排除できることがあります。このアノテーションを使用して、指定されたメモリー領域でのデータ共有問題のレポートを無効にします。このアノテーションは依存関係ツールによってのみ認識されます。
このアノテーションは、ストレージ使用のクリア・アノテーションで終了できます。
構文:
C/C++: |
ANNOTATE_INDUCTION_USES(address, size); |
Fortran: |
call annotate_induction_uses(var) |
C#: |
サポートされていません。 |
address は、このアノテーションのメモリー領域に関する情報を提供する C++ 識別子または式です。
size は、このアノテーションのメモリー領域に関する情報を提供する C++ 識別子または式です。
var は、このアノテーションのメモリー領域に関する情報を提供する Fortran の整数アドレスです。
リダクション変数 (sum += data[i] など) は、並列フレームワーク・コードを追加する際にリダクション操作で置き換えることができます。このアノテーションを使用して、指定されたメモリー領域でのデータ共有問題のレポートを無効にします。このアノテーションは依存関係ツールによってのみ認識されます。
このアノテーションは、ストレージ使用のクリア・アノテーションで終了できます。例えば、C/C++ コードでは、次のように使用します。
ANNOTATE_REDUCTION_USES(&sum, 4); sum += a[i]; ANNOTATE_CLEAR_USES(&sum);
構文:
C/C++: |
ANNOTATE_REDUCTION_USES(address, size); |
Fortran: |
call annotate_reduction_uses(var) |
C#: |
サポートされていません。 |
address は、このアノテーションのメモリー領域の場所に関する情報を提供する C++ 識別子または式です。
size は、このアノテーションのメモリー領域の場所に関する情報を提供する C++ 識別子または式です。
var は、このアノテーションのメモリー領域に関する情報を提供する Fortran の整数アドレスです。
このアノテーションを使用して、指定したメモリー領域へのすべてのアクセスをレポートします。例えば、変数の使用をすべて検出し、コードをどのように再構成すべきか決定するのに役立ちます。このアノテーションは、依存関係レポートでメモリー監視リマークメッセージとして報告されます。このアノテーションは依存関係ツールによってのみ認識されます。
パフォーマンス上の理由から、このアノテーションはスタック上に保存されている変数のメモリーアクセスをレポートしません。
このアノテーションを終了するには、ストレージ使用のクリア・アノテーションを追加します。
構文:
C/C++: |
ANNOTATE_OBSERVE_USES(address, size); |
Fortran: |
call annotate_observe_uses(var) |
C#: |
サポートされていません。 |
address は、このアノテーションのメモリー領域の場所に関する情報を提供する C++ の式です。
size は、このアノテーションのメモリー領域の場所に関する情報を提供する C++ の式です。
var は、このアノテーションのメモリー領域に関する情報を提供する Fortran の整数アドレスです。
このアノテーションは、次のアノテーションを終了するために使用します: インダクション式の使用、リダクションの使用、またはストレージ使用の観測。例えば、C/C++ の ANNOTATE_CLEAR_USES(); アノテーションが ANNOTATE_OBSERVE_USES(); を終了する場合、依存関係ツールは指定した変数のすべての使用のレポートを停止します。このアノテーションは依存関係ツールによってのみ認識されます。
構文:
C/C++: |
ANNOTATE_CLEAR_USES(address); |
Fortran: |
call annotate_clear_uses(var) |
C#: |
サポートされていません。 |
address は、このアノテーションのメモリー領域の場所に関する情報を提供する C++ 識別子または式です。
var は、このアノテーションのメモリー領域に関する情報を提供する Fortran の整数アドレスです。
このアノテーションは、対応する観察アノテーションの有効化に到達するまで問題のレポートを無効化します。このアノテーションの実行後、依存関係ツールは問題をレポートしませんが、ほかのアノテーションの監視を続行するため、一致する観測アノテーションの有効化が実行されると、問題のレポートを再開することができます。これは、誤検出やプログラムには有効でない依存関係の問題を抑制するのに役立ちます。これは、特定のメモリー領域に適用される ANNOTATE_CLEAR_USES; とは異なります。このアノテーションは、観察アノテーションの無効化がポップされ、アノテーションが有効になるまでアクティブなままです。このアノテーションは依存関係ツールによってのみ認識されます。
構文:
C/C++: |
ANNOTATE_DISABLE_OBSERVATION_PUSH; |
Fortran: |
call annotate_disable_observation_push() |
C#: |
DisableObservationPush(); |
このアノテーションに引数はありません。
このアノテーションは、以前実行した観測アノテーションの無効化アノテーションにより停止された依存関係のレポートを有効にします。このアノテーションは依存関係ツールによってのみ認識されます。
構文:
C/C++: |
ANNOTATE_DISABLE_OBSERVATION_POP; |
Fortran: |
call annotate_disable_observation_pop() |
C#: |
Annotate.DisableObservationPop(); |
このアノテーションに引数はありません。
メモリー割り当てアノテーションは、C/C++ プログラムにのみ適用されます。このアノテーションは、依存関係ツールで競合が誤検出されるのを避けるため、非標準またはユーザー定義のメモリー割り当てを示します。依存関係ツールでメモリー割り当てに関連する誤った競合が検出された場合、メモリー割り当てアノテーションのみを使用します。このアノテーションは依存関係ツールによってのみ認識されます。
ヒープに割り当てられたメモリーは、解放して再利用できます。あるタスクにメモリー領域が割り当てられ、解放された後に、別のタスクに同じメモリー領域が再割り当てされると、同期なしで同じ並列メモリー領域にアクセスする 2 つのスレッドがあるように見えるため、依存関係ツール解析は混乱します。プログラムが並列に実行するとき、それぞれのスレッドは異なるメモリーを割り当てることができるため、実際のデータ競合は発生しません。
依存関係ツールは、malloc と free などの標準ライブラリーのメモリー割り当てルーチン、オペレーター new などは認識しますが、ユーザー定義のメモリー・アロケーターを使用している場合、異なるタスク間のメモリーの関係を正確に認識できない可能性があります。アプリケーションがユーザー定義のメモリー・アロケーターを使用する場合、依存関係ツールが関係を理解するのを支援するため、これらのアノテーションを使用する必要があります。次を使用します。
ANNOTATE_RECORD_ALLOCATION を非標準またはユーザー定義アロケーターの後に配置します。
ANNOTATE_RECORD_DEALLOCATION を非標準またはユーザー定義デアロケーターの前に配置します。
このようなアロケーターを使用していない場合、このアノテーションを配置する必要はありません。
ユーザー定義アロケーターを使用し、これらのアノテーションを省略すると、実際にアロケーターによって割り当てられたストレージの [Memory reuse] の問題、およびアロケーターによって使用される制御情報の [Data communication] の問題が報告される可能性があります。
構文:
C/C++: |
ANNOTATE_RECORD_ALLOCATION(address, size); と ANNOTATE_RECORD_DEALLOCATION(address); |
Fortran: |
サポートされていません。 |
C#: |
サポートされていません。 |
ANNOTATE_RECORD_ALLOCATION(address, size); は、ユーザー・メモリー・アロケーターを使用して特定の address と size で割り当てられたストレージを指定します。
必要なすべての Linux Perf* オプションを含む、address は、このアノテーションのメモリー領域の場所に関する情報を提供する C++ の式です。
size は、このアノテーションのメモリー領域のサイズに関する情報を提供する C++ の式です。
デアロケーターでメモリーを解放するたびに、ANNOTATE_RECORD_DEALLOCATION(address); を使用します。
ループのスケジュール・アノテーションは、続くループが同じサイズの (または可能な限り等しい) チャンクに分割されることをスータビリティー・ツールに通知します。デフォルトでは、チャンクサイズはループ反復数を利用可能なスレッド数で割った値です。
構文:
C/C++: |
ANNOTATE_AGGREGATE_TASK; |
Fortran: |
サポートされていません。 |
C#: |
サポートされていません。 |