< 目次

用語集

アムダールの法則 (Amdahl’s law): アプリケーション・プログラムの並列化により得られる最大パフォーマンス・ゲインを予測する理論式です。アムダールの法則は、並列化されていない (シリアル実行) プログラムの領域によって、ランタイム実行時間のスピードアップが制限されることを示します最大限の結果を達成するには、オーバーヘッドを最小限にして、すべてのコアを完全に活用する必要があります。アムダールの法則を使用してプログラムを測定を参照。

アノテーション (annotation): 並列実行に関連する情報を指定する方法です。インテル® Advisor では、マクロまたは関数呼び出しでアノテーションを追加します。それらのアノテーションは、インテル® Advisor が並列実行を予測するために使用されます。例えば、C/C++ の ANNOTATE_SITE_BEGIN(sitename) マクロは、並列サイト の始まりを指定します。後で、このコードを並列実行するため、アノテーションを並列フレームワークを使用するコードに置き換えます。並列フレームワーク と 「アノテーション・タイプのサマリー」を参照。

アトミック操作 (atomic operation): スレッドによるメモリー位置の操作が、別のスレッドの影響を受けないことを保証します。同期 (synchronization) を参照。

チャンク化 (chunking): 並列フレームワークがより効率良く並列処理を行えるように、タスクの複数のインスタンスをグループ化する機能です。計算量が少なく、反復数が多いタスクでは、タスクのチャンク化によりオーバーヘッドを最小化できます。また、単一ループを内部と外部のループに再構成できます (ストリップマイニング)。タスクとタスクのチャンク化を有効にするを参照。

コード領域 (code region): 呼び出しツリー内のループ/関数のサブツリー。入れ子ループ全体と同義語。

クリティカル・セクション (critical section): 同期構文は、一度に 1 つのスレッドのみが関連するコード領域に入ることを許容します。クリティカル・セクションは、囲まれたコード領域の排他実行を強制します。インテル® Advisor 向けに、ANNOTATE_LOCK_ACQUIRE()ANNOTATE_LOCK_RELEASE() アノテーションを使用してクリティカル・セクションをマークします。

データ競合 (data race): 複数のスレッドがメモリー位置を共有 (読み書き) する場合、プログラムが同時メモリーアクセスのシーケンスを管理する制御を実装していないと、あるスレッドが別のスレッドが書き込んだデータを不用意に上書きしたり、古いデータを読み取りまたは書き込む可能性があります。これにより、同じ実行ファイルを異なるシステム上で実行すると計算結果が異なるなど、検出または再現が困難な実行エラーが発生する可能性があります。データ競合を避けるには、一度に 1 つのスレッドが共有メモリーをアクセスすように制限するデータ同期構造を追加するか、共有自体を排除します。

データ並列処理 (Data parallelism): 1 つのコード領域と複数の部分データを組み合わせて、各ペアをタスクとして実行するときに発生します。例えば、ループ本体とループで繰り返される配列の各要素のペアがタスクとなり、それぞれのタスクが並列に実行されます。タスクパターンを参照。タスク並列処理と対照的です。

データセット (data set): 入力として使用されたり、対話型アプリケーションでアプリケーションの一部を実行するためアプリケーションとの対話に使用されるデータのセットです。依存関係ツールは、並列サイト内の各メモリーアクセスを詳しく監視するため、並列サイトのコードは通常よりも実行に長い時間を要します。依存関係解析の実行時間を制限するには、データを減らし (ループの反復回数など)、インタラクティブなプログラムを使用する場合は小さなテストケースを作成します。依存関係ツール向けに小さく典型的なデータセットを選択するを参照。

デッドロック (deadlock): スレッドがそれぞれロックを取得し、ほかのロックが解放されるのを待機している状態を示します。セット内のすべてのスレッドが、別のスレッドで取得されているロックを待機しているため、処理を続行することも取得しているロックを開放することもできず、スレッドは待ち続けます。

動的範囲 (dynamic extent): すべてのコードが、並列サイト または タスク で実行される可能性があります。例えば動的範囲には、ループ、ループから呼び出されるすべての関数、呼び出された関数が呼び出すすべての関数などが含まれます。静的範囲とは対照的です。タスクの構成とアノテーションを参照。

偽陽性 (false positive): 依存関係レポートで報告される実際には問題とならないケースです。

フレームワーク: 並列フレームワークを参照

ヘッド (head): サブツリーの最上位にあるループまたは関数。これには、1 つ以上の子ループ/子関数が含まれます。

ホットスポット (hotspot): プログラムの実行時間を消費する小さなコード領域です。ホットスポットは、インテル® Advisor サーベイツールなどのプロファイラーで特定できます。アムダールの法則を使用してプログラムを測定を参照。

インテル® oneAPI スレッディング・ビルディング・ブロック (oneTBB): マルチコアの利点を活用するプログラムを記述する際に使用できる C++ テンプレート・ライブラリーです。スレッドよりもタスクを利用して、データ並列プログラミングに重点を置き、同時収集と並列アルゴリズムの利点を活用するスケーラブルなプログラムを記述するのにこのライブラリーを使用できます。インテル® oneAPI スレッディング・ビルディング・ブロック (oneTBB) は、インテル® ソフトウェア開発製品として提供されるか、オープンソースとして入手できます。インテル® oneAPI スレッディング・ビルディング・ブロック (oneTBB) は、並列フレームワークの 1 つです。oneTBB の略語。

負荷バランス (load balancing): ワークをコア間で均等に配分します。負荷のバランスが取れていると、コアは大部分の時間をビジーに保たれます。

ロック (lock): 同期メカニズムは、スレッドが別のスレッドを待機して処理を続行するのを可能にします。特定のメモリー位置をアクセスするスレッドを同期するためロックを使用できます。同期入れ子のロックを参照。

マルチコア (multi-core): 2 つ以上の独立したコアが搭載されているプロセッサーを指します。各コアは残りのシステムとのインターコネクトを共有しますが、専用の CPU、アーキテクチャー状態、割り込みコントローラー、プライベート/共有キャッシュを使用して、命令を独立して実行します。ほとんどのマルチコアシステムは同じコアを複数搭載しています。使用されるコア数によって、デュアルコア (2)、クアッドコア (4)、またはメニーコアシステムと呼ばれます。

マルチスレッド化された処理: 並列処理を参照。

相互排他制御 (mutual exclusion): ロックは、通常、アクションが同時に発生することを防ぐために使用されます。ミューテックス (mutex) と呼ばれます。同期を参照。

入れ子になったロック (nested lock): すでにそのロックを所有しているタスクによって再びロックすることができる種類のロック。入れ子になったロックは、いくつかの相互に関連する関数が同じロックを使用する際に有用です。同期ロックを参照。

ノード (node): ループまたは関数。

oneTBB: インテル® oneAPI スレッディング・ビルディング・ブロック (oneTBB)を参照。

OpenMP*: コンパイラー・ディレクティブ (C/C++ プラグマと Fortran ディレクティブ)、ライブラリー関数、および環境変数で構成される共有メモリー型並列プログラミングをサポートするために設計された、高レベルの並列フレームワークと言語拡張です。OpenMP* 仕様は、各種プラットフォーム上で並列プログラミング向けのスケーラブルな移植性の高いインターフェイスを提供するため、多くのハードウェアとソフトウェア・ベンダーにより開発されました。OpenMP* は並列フレームワークの 1 つです。http://openmp.org (英語) を参照してください。

並列フレームワーク (parallel framework): プログラムコードを並列実行するためのライブラリー、言語機能、またはその他のソフトウェア技術の組み合わせです。例えば、OpenMP*、インテル® oneAPI スレッディング・ビルディング・ブロック (oneTBB) 、メッセージ・パッシング・インターフェイス (MPI)、インテル® Concurrent Collections for C/C++、Microsoft* タスク並列ライブラリー* (TPL)、および POSIX* スレッドなどの低レベルのスレッド API が含まれます。一部の並列フレームワークは、共有メモリー並列処理をサポートしていますが、MPI などのフレームワークは非共有メモリー並列処理をサポートします。インテル® oneAPI スレッディング・ビルディング・ブロック (oneTBB)、および並列フレームワークの概要を参照。

並列処理 (parallel processing): プログラムの実行中に複数のスレッドを使用します。インテル® Advisor は、共有メモリーシステム向けの並列処理に注目します。並列処理には、クラスター、グリッド、ベクトルなど別のタイプもあります。並列性と呼ばれることもあります。ホットスポットスレッドを参照。

並列領域 (parallel region): オフロードのモデル化の用語。特定の並列フレームワーク構造で始まるコード領域。インテル® oneAPI スレッディング・ビルディング・ブロック (oneTBB )、インテル® oneAPI データ・アナリティクス・ライブラリー (oneDAL)、OpenMP*、データ並列 C++ (SYCL++) 並列フレームワークがサポートされます。

並列サイト (parallel site): 並列に実行できるタスクを 2 つ以上含むコード領域のことです。アノテーションとタスクの構成とアノテーションをご覧ください。

パイプライン (pipeline): データ並列処理とタスク並列処理の両方を活用するようにタスクの計算を構成し、計算を所定の順番で実行するステージに編成する手法です

セルフ時間 (self time): [サーベイレポート] ウィンドウで、特定の関数やループで費やされた時間を示します。

サイト (site): 並列サイトを参照。

共有メモリー並列処理: 並列処理を参照。

静的領域 (static extent): サイトやタスクの _BEGIN と _END アノテーションの間に記述されたコードです。静的領域は語彙的にペアにならないことがあります。例えば、1 つの _BEGIN ポイントに対して、複数の独立した _END ポイントが必要になるかもしれません。動的領域とは対照的です。アノテーション並列サイト、およびタスクの構成とアノテーションをご覧ください。

同期 (synchronization): 複数のスレッドの実行を調整します。共有メモリー位置の代わりにプライベート・メモリー位置を使用することで、タスク内の同期を実現できる場合もあります。それ以外の場合、ロックミューテックスを使用して、共有データへのアクセスを制限できます。データ共有問題のタイプを参照。

タスク (task): 実行するためスレッドに渡すことができるコード領域とそのデータです。タスクの構成とアノテーション、タスクの選択、およびチャンク化を参照。

タスク並列処理 (Task parallelism): 2 つの異なるコード領域を個別のタスクに配置して並列に実行します。例えば、表示する状態とディスプレイ・アルゴリズムをペアにしたタスクと、同じ状態と次の状態を計算するアルゴリズムをペアにしたタスクを並列に実行します。タスクパターンを参照。データ並列処理と対照的です。

スレッド (Thread): スレッドはプロセスの命令を実行します。それぞれのプロセスには、同時に 1 つ以上のアクティブなスレッドがあります。スレッドはプロセスのアドレス空間を共有しますが、個別のスタック、プログラムカウンター、およびレジスターを持ちます。

合計時間 (Total time): [サーベイレポート] ウィンドウで、特定の関数やループで費やされた時間とその呼び出し先で費やされた時間を示します。

ベクトル処理 (vector processing): 複数のデータ項目をベクトルレジスターにパックして、ベクトル命令によりそれらを単一の命令で操作できるようにする並列処理の形式です。パックしたベクトルデータを処理する命令数を減らすことで、メモリーの利用とレイテンシーを最小化し、参照の局所性とデータキャッシュの利用を最適に保つことができます。ベクトル命令は、SIMD (Single Instruction Multiple Data) 命令です。インテル® アドバンスト・ベクトル・エクステンション (インテル® AVX) やインテル® アドバンスト・ベクトル・エクステンション 512 (インテル® AVX-512) などの一部の SIMD ベクトル命令は、より多くのパックドデータを格納できる幅の広いレジスターをサポートしています。