シリアル (並列化されていない) プログラムはシングルスレッドを使用するため、マルチスレッドが共有リソースを使用する際に生じる問題を制御する必要はありません。
プログラムは完了するのに時間がかかります。シリアルプログラムは単一コアのみを使用するため、システムに複数のコアがあっても実行時間を短縮することは出来ません。しかし、プログラムに並列処理 (並列性) を実装することで、複数のコアを活用して実行時間を短縮できます。
オペレーティング・システムのプロセスは、アドレス空間、開いたファイル、およびその他のリソースを持ちます。スレッドはプロセスの命令を実行します。それぞれのプロセスには、同時に 1 つ以上のアクティブなスレッドがあります。スレッドはプロセスのアドレス空間を共有しますが、個別のスタック、プログラムカウンター、およびレジスターを持ちます。複数のスレッドを使用するプログラムは、マルチスレッド化されたまたは並列プログラムと呼ばれます。
タスクはプログラムの一部であり、プログラムのほかの部分、またはそのほかのタスクのインスタンスと並列に実行できます。それぞれのタスクはスレッドによって実行され、オペレーティング・システムがスレッドをプロセッサー・コアへ割り当てます。
ホットスポットは、プログラムの実行時間を消費する小さなコード領域です。プログラムが時間を消費している場所を特定するため、インテル® Advisor のスータビリティー・ツールなどのプロファイル・ツールを使用できます。並列処理を追加してプログラムのパフォーマンスを高めるには、次のことを行います。
ホットなループやホットなルーチンなど、ホットスポットと呼び出しツリーのホットな部分を特定します。インテル® Advisor のサーベイツールは、上位のホットなループを特定する拡張トップダウン呼び出しツリーを提供します。
main() の呼び出しツリーにあるすべての関数からそれぞれのホットなルーチンやループを調査します。実行頻度の高い命令を、同時に実行できる異なるタスクに分散します。
同じコード領域が何度も実行されることで呼び出しツリーにホットな部分が生じる場合、コードの複数のインスタンスをそれぞれ異なるコアで実行することが可能であるかもしれません。これはデータ並列処理と呼ばれ、それぞれの実行は同じデータ項目の異なる範囲を処理します。配列全体を処理する計算集約型のループは、データ並列処理の候補となります。例えば、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); }
複数のコアを効率良く使用するには、データレベルの並列処理で大量のデータを処理し、タスク並列処理でプログラムの関連のない部分の実行をオーバーラップする必要があります。