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

同カテゴリーの次の記事

ヘテロジニアス・アーキテクチャーのプログラミングに OpenMP* オフロードを使用する

このガイドは、インテル コーポレーションが提供するガイド「Intel Guide for Developing Multithreaded Applications」の日本語参考訳です。


編集注記:
本記事は、2011 年 5 月 4 日に公開されたものを、加筆・修正したものです。
この記事は、体系的および段階的な最適化フレームワークを通じて、アプリケーション・コードのパフォーマンスを最大限に活用する、開発者をサポートするインテル® Modern Code 開発者コミュニティーのドキュメントの一部です。この一連の記事では並列化に注目します。

第 1 章 – アプリケーションのスレッド化

並列パフォーマンスにおける一般的なトピックを紹介します。また、API 固有の問題についても触れています。

1-1 並列パフォーマンスの予測と測定
1-2 ループの最適化によるデータの並列パフォーマンスの強化
1-3 粒度と並列パフォーマンス
1-4 ロードバランスと並列パフォーマンス
1-5 人工的な依存関係の回避/排除による並列性の顕在化
1-6 スレッドの代替としてのタスクの使用
1-7 順序付きデータ構造におけるデータの並列化
1-8 アセンブリーや組込み関数を利用することなくインテル® AVX を使用するには

第 2 章 – 同期

同期が及ぼすパフォーマンスへの負の影響を緩和する手法を紹介します。

2-1 ロック競合の管理: 大小のクリティカル・セクション
2-2 スレッド API の同期ルーチンの使用
2-3 オーバーヘッドを最小限に抑える適切な同期プリミティブの選択
2-4 非ブロッキング・ロックの使用

第 3 章 – メモリー管理

スレッド化により、メモリー管理においては無視することのできない別の側面がもたらされます。ここでは、マルチスレッド・アプリケーションに特有のメモリーに関する問題について説明します。

3-1 スレッド間のヒープ競合の回避
3-2 スレッド・ローカル・ストレージを利用して同期を軽減する
3-3 マルチスレッド・アプリケーションのメモリー帯域飽和を検出する
3-4 スレッド間のフォルス・シェアリングの回避と特定
3-5 NUMA 向けのアプリケーションの最適化

第 4 章 – プログラミング・ツール

インテル® ソフトウェア開発製品を使用して、マルチスレッド・アプリケーションの開発、デバッグ、最適化を行う方法を紹介します。

4-1 インテル® コンパイラーによる自動並列化
4-2 インテル® マス・カーネル・ライブラリー (インテル® MKL) での並列処理
4-3 スレッド化とインテル® インテグレーテッド・パフォーマンス・プリミティブ (インテル® IPP)
4-4 インテル® Inspector を使用した OpenMP* ベースのマルチスレッド・コードにおける競合状態の検出
4-4(a) インテル® Inspector を使用したマルチスレッド・コードのデータ競合の検出
4-5 インテル® VTune™ Amplifier を使用したスレッド・インバランスの解消
4-6 インテル® Parallel Composer による並列実行コードの準備
4-7 データ構造とメモリー・アクセス・パターンを最適化してデータの局所性を高める

並列プログラミング・コミュニティー (2015 年 7 月にインテル® Modern Code 開発者コミュニティーに名称を変更) では、ソフトウェア開発者向けに、アプリケーションのスレッド化、同期、メモリー管理、プログラミング・ツールに関する最新の技術資料を公開しました。これらのスレッド化手法は、インテル® Xeon® プロセッサーやインテル® Xeon Phi™ プロセッサーで高い性能を達成するため今でも重要です。これらの資料に関するご意見、ご要望をお待ちしております。並列アーキテクチャー向けモダンコードのフォーラム (英語) に是非ご参加ください。

1.1 モチベーション
このガイドの目的は、インテル® アーキテクチャー・ベースの対称型マルチプロセッサー (SMP) またはインテル® ハイパースレッディング・テクノロジー対応システム、あるいはその両方で動作する、効率的なマルチスレッド・アプリケーション開発のガイドラインを示すことです。アプリケーション開発者は、このガイドの推奨事項を参考にすることで、インテル® プロセッサーで構築される現在および将来の SMP アーキテクチャー上でのマルチスレッド処理パフォーマンスを向上させ、予期しないパフォーマンスの変動を最小限に抑えることができます。

ガイドでは、マルチスレッド・アプリケーションのパフォーマンスに関する一般的な推奨事項を示します。ハードウェア固有の最適化手法の説明は、最小限に抑えています。将来のバージョンでは、移植性を犠牲にしてもパフォーマンスを向上させたい開発者のために、ハードウェア固有の最適化手法の項目を追加する予定です。

1.2 必要条件
高水準言語 (できれば、C、C++、または Fortran) のプログラミング経験が必要です。このガイドの推奨事項の多くは、Java*、C#、Perl などの言語にも当てはまります。また、読者は、基本的なコンカレント・プログラミングについて理解し、1 つ以上のスレッド化手法 (できれば、OpenMP*、POSIX* スレッド (Pthread とも呼ばれる) またはスレッド関連の Win32* API) についてもよく理解している必要があります。

1.3 範囲
このガイドの主な目的は、インテル® プラットフォーム上のマルチスレッド・アプリケーションの設計および最適化ガイドラインのクイック・リファレンスを提供することです。このガイドは、マルチスレッド処理に関する教科書や、インテル® プラットフォームへの移植ガイドとしての使用を前提としたものではありません。

1.4 構成
このガイドは、すべてのマルチスレッド化手法に適用される一般的な推奨事項から、インテル® ソフトウェア開発製品向けの使用ガイドラインと API 固有の情報に至るまでをカバーします。このガイドの各項目は独立していますが、トピックは次の 4 つのカテゴリーに分類されます: アプリケーションのスレッド化、同期、メモリー管理、プログラミング・ツール。各項目はスレッド化にとって重要な特定の事項について説明しており、多くの項目が互いを補足するように構成されています。全体を通して、関連項目への相互参照が示されます。

1.5 著者および編集者
次のインテル社のエンジニアおよびテクニカル・エキスパートがこのガイドの開発のため、執筆、レビュー、編集に貢献しました: Henry Gabb、Martyn Corden、Todd Rosenquist、Paul Fischer、Julia Fedorova、Clay Breshears、Thomas Zipplies、Vladimir Tsymbal、Levent Akyil、Anton Pegushin、Alexey Kukanov、Paul Petersen、Mike Voss、Aaron Tersteeg、Jay Hoeflinger。

1.6 並列プログラマーから寄せられた本ガイドの初期レビュー
Tom Spyrou 氏は、プログラミング・ツールの記事「インテル® Parallel Amplifier を使用したスレッド・インバランスの解消」と「スレッド間のフォルス・シェアリングの回避と識別」 (英語) のレビューで、スレッドに割り当てられた作業を調整する方法とメインメモリーの帯域幅によって引き起こされるプログラムのボトルネックを検出する方法について述べています。

Asaf Shelly 氏は、記事「スレッド間のヒープの競合の回避」 (英語) のレビューで、各スレッドに独自のヒープを確保してメモリー割り当てを正しく行う方法を述べています。

Clay Breshears 氏は、記事「粒度と並列パフォーマンス」 (英語) のレビューで、吹雪と並列計算の粒度について述べています。

製品とパフォーマンス情報

1インテル® コンパイラーでは、インテル® マイクロプロセッサーに限定されない最適化に関して、他社製マイクロプロセッサー用に同等の最適化を行えないことがあります。これには、インテル® ストリーミング SIMD 拡張命令 2、インテル® ストリーミング SIMD 拡張命令 3、インテル® ストリーミング SIMD 拡張命令 3 補足命令などの最適化が該当します。インテルは、他社製マイクロプロセッサーに関して、いかなる最適化の利用、機能、または効果も保証いたしません。本製品のマイクロプロセッサー依存の最適化は、インテル® マイクロプロセッサーでの使用を前提としています。インテル® マイクロアーキテクチャーに限定されない最適化のなかにも、インテル® マイクロプロセッサー用のものがあります。この注意事項で言及した命令セットの詳細については、該当する製品のユーザー・リファレンス・ガイドを参照してください。
注意事項の改訂 #20110804

関連記事