< 目次

並列処理の用語

シリアル (並列化されていない) プログラムはシングルスレッドを使用するため、マルチスレッドが共有リソースを使用する際に生じる問題を制御する必要はありません。

プログラムは完了するのに時間がかかります。シリアルプログラムは単一コアのみを使用するため、システムに複数のコアがあっても実行時間を短縮することは出来ません。しかし、プログラムに並列処理 (並列性) を実装することで、複数のコアを活用して実行時間を短縮できます。

スレッドとタスク

オペレーティング・システムのプロセスは、アドレス空間、開いたファイル、およびその他のリソースを持ちます。スレッドはプロセスの命令を実行します。それぞれのプロセスには、同時に 1 つ以上のアクティブなスレッドがあります。スレッドはプロセスのアドレス空間を共有しますが、個別のスタック、プログラムカウンター、およびレジスターを持ちます。複数のスレッドを使用するプログラムは、マルチスレッド化されたまたは並列プログラムと呼ばれます。

タスクはプログラムの一部であり、プログラムのほかの部分、またはそのほかのタスクのインスタンスと並列に実行できます。それぞれのタスクはスレッドによって実行され、オペレーティング・システムがスレッドをプロセッサー・コアへ割り当てます。

ホットスポット - プログラムが時間を費やす場所を特定

ホットスポットは、プログラムの実行時間を消費する小さなコード領域です。プログラムが時間を消費している場所を特定するため、インテル® Advisor のスータビリティー・ツールなどのプロファイル・ツールを使用できます。並列処理を追加してプログラムのパフォーマンスを高めるには、次のことを行います。

データとタスク並列処理

同じコード領域が何度も実行されることで呼び出しツリーにホットな部分が生じる場合、コードの複数のインスタンスをそれぞれ異なるコアで実行することが可能であるかもしれません。これはデータ並列処理と呼ばれ、それぞれの実行は同じデータ項目の異なる範囲を処理します。配列全体を処理する計算集約型のループは、データ並列処理の候補となります。例えば、process(a[i]);が以下のように使用されるとタスクの候補となります。

for (int i = 0; i != n; ++i) { 
     process(a[i]); 
}

2 つ以上のホットスポットが近接してシリアル実行され、データが共有されない場合、ホットスポットをタスクとして実行することが可能です。これは、タスク並列処理と呼ばれます。例:

initialize(data); 
     while (!done) { 
          old_data = data; 
          display_on_screen(old_data); 
          update(data); 
     }

複数のコアを効率良く使用するには、データレベルの並列処理で大量のデータを処理し、タスク並列処理でプログラムの関連のない部分の実行をオーバーラップする必要があります。