マルチコア向け並列プログラミングの 8 つのルール

HPC

この記事は、The Parallel Universe Magazine 40 号に掲載されている「8 Rules for Parallel Programming for Multicore」の日本語参考訳です。


parallel_v40_06
[編集者注: この記事は The Parallel Universe 1 号 (2009 年 4 月) に掲載されたものです。前編集長 James Reinders のアドバイスは 11 年経過した現在でも適切なものです。その先見性に敬意を表して、この号で再掲することにしました。]

マルチコア・プロセッサー向けのプログラミングは新しい挑戦です。ここでは、マルチコア・プログラミングで成功するための 8 つのルールを紹介します。

ルール 1: Think Parallel (並列化を考える)

並列処理を意識しながら、すべての問題にアプローチします。並列化の場所を理解し、それを適用する考えを整理します。その他の設計や実装の決定を下す前に、最も良い並列アプローチを決定します。「Think Parallel」並列処理の思考を身につけます。

ルール 2: 抽象化を使用してプログラミングする

並列化を表現するコードの記述に重点を置き、スレッドやプロセッサー・コアを管理するコードの記述を避けます。ライブラリー、OpenMP*、インテル® スレッディング・ビルディング・ブロックなどは、すべて抽象化を使用している例です。ネイティブスレッド (pthreads*、Windows* スレッド、Boost スレッドなど) は使用しないようにしてください。ネイティブ・スレッド・ライブラリーは、並列化のアセンブリー言語です。これらは最も柔軟性がありますが、記述、デバッグ、保守に多大な時間が必要です。スレッド管理やコア管理を行うプログラミングではなく、問題に対応するプログラミングを行えるよう、コードは十分にレベルの高いものである必要があります。

ルール 3: スレッド (core: コア) ではなく、タスク (chore: 仕事) をプログラミングする

スレッドやプロセッサー・コアへのタスクのマッピングは、プログラムの中で明確に分離された処理にしておきます。使用する抽象化は、プログラマーの代わりにスレッド/コア管理を行ってくれるものであることが望ましいでしょう。プログラムには多くのタスク、またはプロセッサー・コア間で自動で処理されるタスク (OpenMP* ループなど) を作成してください。タスクを作成することで、オーバーサブスクリプションを心配することなく、自由に可能な限り多くの処理を作成できます。

ルール 4: 並列処理をオフにするオプションを付けて設計する

デバッグ作業を簡単にするには、並列処理を行わずに実行できるプログラムを作成します。デバッグの際に、最初は並列処理をオンにして実行し、その後オフにすることで、両方の実行で失敗するかどうかを調査できます。プログラムが並列実行されていない場合、一般的な問題は診断がしやすく、従来のツールでもサポートされているため、デバッグが簡単です。並列実行時のみ不具合が生じることが分かれば、追跡中の不具合がどのような種類のものかを特定する手がかりになります。このルールを無視して、シングルスレッドで実行できないプログラムを作成した場合、デバッグ作業に過度の時間を費やすことになります。シングルスレッドの実行はデバッグ用にのみ必要なため、効率的である必要はありません。「Producer-Consumer (生産者-消費者)」モデルなど、並行処理が正しく動作しなければならない並列プログラムの作成を避ければ良いだけです。

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

タイトルとURLをコピーしました