並列アプリケーション最適化のための計画

HPC

この記事は、インテル® デベロッパー・ゾーンに掲載されている「Planning for Parallel Optimization」(http://software.intel.com/en-us/articles/planning-for-parallel-optimization) の日本語参考訳です。


近年、マルチコア・テクノロジー向けにアプリケーションを最適化することが急速に求められています。マルチコア・コンピューターは、2010 年の PC 出荷台数の 83% を占めるまでに拡大し、もはやメインストリームとなりました。コアの数も増加しています。IDC の報告によると、2012 年の PC 出荷台数の 60% が 4 コア以上を搭載しています (Worldwide PC Processor Forecasting 2009-2013)。並列処理の最適化は大幅なパフォーマンスの向上をもたらしますが、アプリケーションに合わせて適切なアクションプランが必要になります。この記事では、並列処理の最適化に役立つヒントを紹介します。

再設計かチューニングか

最初に、並列処理を考慮して設計し直すか、既存のコードをチューニングするかを選択する必要があります。すでに正しく動作するシリアル・アプリケーションがある場合は、それを基に並列化する方法を考えることができます。

既存のコードを変更する前に、現在のソフトウェアのパフォーマンスを測定してベースラインとなるパフォーマンスを求めます。そして、変更を行うたびにパフォーマンスを測定し直して、変更によって実際にパフォーマンスが向上したかどうかを確認します。

アプリケーションによりパフォーマンスの測定方法は異なります。繰り返しパフォーマンスを測定できるように、最初に測定に使用するワークロードを定義します。ワークロードとは、アプリケーションで実行する 1 つのタスクまたはタスクのセットです。繰り返し利用可能なワークロードを定義し、そのワークロードを実行してパフォーマンスを測定します。一定時間内に完了するワーク量が分かれば、後でそのワークロードを再度実行して、アプリケーションが同じ時間内により多くのワークを完了できるか、あるいは同じ量のワークをより短い時間内に完了できるかを検証できます。そうすることで、アプリケーションのチューニング過程で、パフォーマンスの向上を比較検証することができます。また、インテル® Concurrency Checker などのツールを使って、アプリケーションのコンカレンシー (平行性) レベルを測定し、チューニングの進み具合を評価することもできます。

機能またはデータを分割する

既存のシリアル・アプリケーションを並列化する場合、アプリケーションの構造に応じて、機能を分割するか、データを分割するか (あるいは両方か) を決定します。

  • 互いに独立した機能やタスクがある場合、それらは並列に実行できる可能性があります。
  • アプリケーションに大量のデータを扱う関数があり、そのデータを個別に処理できる小さな単位に分割できる場合、データ分割を行える可能性があります。

アプリケーションの特性も最適な並列処理の粒度に影響します。粒度とは、アプリケーションを構成するタスクが互いに通信する頻度を指します。通信の頻度が低いほど、より粗い並列処理を使用することができ、通信オーバーヘッドが小さくなるため、並列処理によって多くの利点がもたらされる傾向があります。

hotspot とボトルネックを見つける

コードを変更する前に、コード中の hotspot を見つけることが重要です。コード中の hotspot やボトルネックを検出するツールは、パフォーマンスの向上に最も効果的な領域を変更できるように手助けしてくれます。hotspot とは、プロセッサーが多くの時間を費やしているコード位置のことで、最適化の良い候補となります。ただし、hotspot の中には、ワーク量が多いためにプロセッサーが多くの時間を費やしているだけで、コードはすでに効率的である場合もあります。コードの効率が悪いことが原因でプロセッサーが多くの時間を費やしている場合、hotspot はボトルネックになります。並列化できる場合、ボトルネックは最適化を行う理想的な場所です。

手法を選択する

変更すべきコード領域を特定したら最適化を行いますが、その手法はいくつかあります。インテルの並列コンピューティング調査 (Evans Data Corp.、2011 年 4 月) によると、開発者に最もよく利用される並列プログラミング手法は、マルチスレッディング、共有メモリーモデル、メッセージパッシングです。

  • マルチスレッディングでは、1 つのプロセスに複数のスレッドが存在し (タスクは CPU によって実行される)、メモリーとその他のリソースが共有されます。その結果、マルチコアシステムでより高速に処理できます。欠点は、非決定性が生じることです。処理の実行順序が予測できず、エラーにつながる可能性があります。
  • 共有メモリーモデルでは、1 つのメモリー空間が複数のプロセッサーにより使用されます。操作しやすい統合アドレス空間が提供されますが、イベント間に依存性がある場合は、競合状態を回避するための対処が必要です。
  • メッセージパッシングでは、プロセス間の通信が発生します。実装により多くの労力が必要になる可能性がありますが、同期によって競合状態は回避されます。

進捗状況を評価しエラーをチェックする

アプリケーションに並列処理を実装して改善するたびに、ワークロードを実行してパフォーマンスを測定し直し、パフォーマンスが向上しているかどうかを確認すると良いでしょう。このとき、スレッドエラーを検出するインテル® Inspector XE などのツールを利用して、不具合が生じていないかどうかも検証することが重要です。行った並列処理の最適化が正しいことを確認したら、さらなる並列化とパフォーマンス向上のため (目標を達成するまで) このプロセスを繰り返します。

並列処理の最適化についての関連情報は、インテル® デベロッパー・ゾーンの並列プログラミング・コミュニティーや iSUS の並列プログラミング・ページをご覧ください。マルチコア・テクノロジー向けにアプリケーションを最適化する上で役立つツールやリソースが提供されています。

著者紹介

Diana Byrne
ソフトウェア & サービスグループのマルチコア製品マネージャーで、2004 年からインテル コーポレーションに在籍。数学、コンピューター・サイエンス、技術経営の修士号を取得しています。

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

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