並列化・マルチスレッドアプリケーションの開発に向けた「マルチスレッド・アプリケーション開発のためのインテル・ガイド」

 エクセルソフトは「マルチスレッド・アプリケーション開発のためのインテル・ガイド」というドキュメントを公開した。並列化・マルチスレッドアプリケーション開発者が知っておくべき知識をまとめた、非常に有用なドキュメントとなる。

「マルチスレッド・アプリケーション開発のためのインテル・ガイド」
「マルチスレッド・アプリケーション開発のためのインテル・ガイド」

 近年のマルチコアCPUの普及により、動画/音声エンコーダといったマルチメディア関連アプリケーションや多くの数値計算が必要なアプリケーションなどにおいて、マルチスレッド化による性能向上が注目されている。これらは並列化などとも呼ばれており、従来1つのCPUコアでのみ行っていた処理を、複数のコアに分散させて並列処理することにより、処理速度の向上を計るものだ。

 しかし、マルチスレッドプログラミングは複数の処理を同時に実行させるという構造上、その実装やデバッグなどが複雑・面倒になることが多い。マルチスレッド化されたプログラムでは適切なデータの分割や排他処理を含むスレッドごとの同期、適切なメモリ管理など、マルチスレッド化されていない、処理を順に実行していくようなプログラムと比べると考慮しなければならないポイントが多いからだ。

 現在ではOpenMPやインテル スレッディング・ビルディング・ブロックといった並列化を支援するAPIやライブラリが登場しており、これらを利用することで比較的容易に並列化されたプログラムを実装できそうに見える。しかし、プログラムを並列化するにはアルゴリズムを含む処理過程についても変更が必要である。インテル コンパイラーやインテル Parallel Studioといった自動並列化機能を備えた開発ツールも登場しているものの、より高いパフォーマンスを求めるのであれば、手動によるチューニングも必要である。

 エクセルソフトのWebサイト上で公開されている「マルチスレッド・アプリケーション開発のためのインテル・ガイド」は、並列化された、マルチスレッドアプリケーションを開発するための注意点やポイントなどを解説するドキュメントだ。並列化のドキュメントというと理論的な説明を行うもの、もしくはライブラリ/APIなどの解説をするものが多いが、このドキュメントは実践的な内容となっており、実際にどのような個所をどう並列化するか、またどのように同期やメモリ管理を行うべきかなど、実際の開発に役立つものとなっている。

 「マルチスレッド・アプリケーション開発のためのインテル・ガイド」では「アプリケーションのスレッド化」および「同期化」、「メモリー管理」、「プログラミング・ツール」の計4章、合計21本の記事が掲載されている。連番が振られているもののそれぞれの記事は独立しており、順番に読み進める必要はない。もちろんすべてに目を通しておくのが良いのだが、高度な内容を含む記事もあるため、適宜必要な個所を読むだけでも十分参考になるだろう。

 たとえば、インテル コンパイラーやParallel Studioを使用しているなら、まずは「プログラミング・ツール」の章から読むと良い。「インテル コンパイラーによる自動並列化」や「インテル Parallel Composer による並列実行コードの準備」ではインテル コンパイラー(Paralel Studioにも含まれる)で利用できる並列化機能と、コンパイラが自動的に並列化を行う「自動並列化」の利用法が解説されている。そのほか、Parallel InspectorやParallel Amplifier、インテル マス・カーネル・ライブラリー(MKL)、インテル インテグレーテッド・パフォーマンス・プリミティブ(IPP)などの使い方も紹介されているので、それぞれ参照しておきたい。

 「アプリケーションのスレッド化」の章では、並列化をどのように実装すべきかを説明している。「ループの最適化によるデータの並列パフォーマンスの強化」や「粒度と並列パフォーマンス」ではループを多く含むようなプログラムを並列化する例を、「ロードバランスと並列パフォーマンス」や「人工的な依存関係の回避/排除による並列性の顕在化」ではパフォーマンスをより向上させるためのテクニックを紹介している。また、複数の異なる処理を行うようなプログラムの場合、それぞれの処理を別のスレッドで実行させる形での並列化が考えられる。「スレッドの代替としてのタスクの使用」や、「順序付きデータ構造におけるデータの並列化」ではそのようなタイプの並列化について解説がされている。

 次の「同期化」の章では、クリティカルセクションなどを使ったマルチスレッドアプリケーションの同期について解説が行われている。シングルスレッドアプリケーションを並列化するような場合は、まずは「ロック競合の管理: 大小のクリティカル・セクション」をチェックしておけば良いだろう。また、すでにマルチスレッド化されているアプリケーションに対してチューニング・改善を行う場合は、「スレッド化 API の同期化ルーチンの使用」や「オーバーヘッドを最小限に抑える適切な同期プリミティブの選択」、「非ブロッキング・ロックの使用」といったより高度な内容を説明する記事も参考になるだろう。

 「メモリー管理」の章では、プログラムのパフォーマンス向上を主眼に置いた解説が行われている。内容的にも若干レベルが高く、並列化の中・上級者向けと言えるだろう。「スレッド間のヒープ競合の回避」や「スレッド・ローカル・ストレージの使用による同期化の軽減」では比較的適用しやすい手法を紹介しているため、パフォーマンスチューニングを考えているなら目を通しておくと良い。いっぽう「マルチスレッド・アプリケーションのメモリー帯域飽和の検出」や「スレッド間のフォールス・シェアリングの回避と特定」はCPUのキャッシュやメモリ帯域までも考慮する上級者向けの内容である。そのため、初級者は読み飛ばしても良いだろう。

 マルチスレッド・アプリケーション開発のためのインテル・ガイドは米Intelによって作成されたドキュメントということもあり、非常に充実した内容となっている。インテル コンパイラーやインテル Parallel Studioといった同社製ツールを使っているユーザー以外でも非常に参考になる内容なので、並列化を考えている開発者は、ぜひ目を通しておくべきだろう。