書籍転載
文法からはじめるプログラミング言語Microsoft Visual C++入門

並列処理を行うための基礎知識(Visual C++)
――第13章 並列処理〜マルチスレッドプログラミング(前編)――

WINGSプロジェクト 矢吹 太朗(監修 山田 祥寛)
2010/04/13
Page1 Page2

本コーナーは、日経BPソフトプレス発行の書籍『文法からはじめるプログラミング言語Microsoft Visual C++入門』の中から、特にInsider.NET読者に有用だと考えられる章や個所をInsider.NET編集部が選び、同社の許可を得て転載したものです。基本的に元の文章をそのまま転載していますが、レイアウト上の理由などで文章の記述を変更している部分(例:「上の図」など)や、図の位置などを本サイトのデザインに合わせている部分が若干ありますので、ご了承ください。『文法からはじめるプログラミング言語Microsoft Visual C++入門』の詳細は「目次情報ページ」もしくは日経BPソフトプレスのサイトをご覧ください。

ご注意:本記事は、書籍の内容を改変することなく、そのまま転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。

 プログラムの処理を複数に分割し、並行して実行するようにする方法を紹介します。そのようなプログラムが、CPU(あるいはコア)が複数あるようなコンピュータで高速に実行できるのはもちろんですが、そうでない(つまりCPUが1つしかないような)場合にも性能の向上が期待できます。

13.1 並列処理

 並列処理とは何かを説明し、Visual C++ Express Edition上で利用できる並列処理用のライブラリを紹介します。

13.1.1 逐次処理と並列処理

 複数の処理を並行して同時に実行することを並列処理と言います。並列処理と対立する概念が逐次処理で、逐次処理においては、複数の処理が順番に実行されます。コンピュータにおける並列処理と逐次処理を図示すると、図13-1の1と2のようになります。CPUが複数あるようなコンピュータ上で、互いに独立な処理AとBを並列的に実行すれば(図13-1の2)、逐次的に実行した場合(図13-1の1)に比べて処理時間を大幅に短縮できることが期待できます*1

*1 物理的なCPU は1つしかないにもかかわらず、OS からは複数のCPU があるように見えるハイパースレッディングや、1つのパッケージの中に複数のコアがあるマルチコアCPU も、「CPU が複数あるような」という表現に該当します。

図13-1 複数の処理を実行する方法

 今日広く使われているコンピュータは並列処理をサポートしています。Windows上で音楽を聴きながらメールを読み書きできるのは、OS(Windows)が音楽プレーヤーとメーラーという2つのプログラムの並列実行をサポートしているからです。音楽プレーヤーやメーラーのようなプログラムが実行されるとき、OSはそれぞれに対してプロセスを生成します。プログラムの実体であるプロセスには、専用のメモリが用意されます(図13-2のプロセスA)。基本的には、1つのプログラムは1つのプロセスから成ると考えてよいでしょう。CPUが1つしかないようなコンピュータでも、音楽プレーヤーとメーラーを同時に使うことができるのは、OSが複数のプロセスを短時間で切り替えながら実行しているからです*2

*2 実際には並列に処理されているわけではないが、並列に処理されているように見えるものを疑似並列、疑似並列と(真の)並列を併せて並行と呼ぶことがありますが、本書では特に使い分けません。

図13-2 プロセスとスレッド

 プロセスの中で行われる具体的な処理をスレッドと呼びます。これまで作成してきたプログラムは、実行するとプロセスが1つ生成され、その中でスレッドが1つだけ動作するシングルスレッドプログラムでした(第12章は例外ですが、スレッドを意識する必要はありませんでした)。図13-2のプロセスBのように、プロセスは複数のスレッドを含むことができます。そのような、実行時に複数のスレッドを利用するプログラムをマルチスレッドプログラムと呼びます。たとえば音楽プレーヤーなら、ボリュームの変更のようなGUI操作と曲の再生とは別々のスレッドで処理されるのが一般的です。

 プロセスの場合と同様に、スレッドもCPUが複数あるときには真に並列に実行されます(図13-1の2)。CPUが1つしかない場合には、図13-1の3のように実行されます。プロセスの場合と比較すると、単一CPU上で複数のスレッドを実行することの意義はわかりにくいかもしれません。音楽プレーヤーにおいて、音楽の再生を止めることなくボリュームを変更することができるのは、これらが別のスレッドで行われているためです。メーラーにおいて、メールを受信している間にメールを書くことができるのも同様です。

 複数のスレッドを利用することによって、たとえCPUが1つしかなくても処理速度が向上することがあります。図13-1の4のように、2つの処理AとBを実行しなければならない状況を考えます。どちらもある程度の時間のかかる処理ですが、処理Aにかかる時間の大部分は、ディスクアクセスによるものだとしましょう。CPUの情報処理速度に比べると、ディスクの読み書きの速度は非常に遅いので、これはよくある事態です。例として、図13-1の4のように2つの処理を単純に逐次的に実行すると、かかる時間はディスクIOの時間と処理Bにかかる時間の合計です。しかし、図13-1の5のように処理Aと処理Bを別々のスレッドにして、切り替えながら実行することにすれば、ディスクIOを待っている間に処理Bを実行することができるので、全体の処理時間を短縮することができるのです(処理Bが処理Aの結果に依存しないようなものでなければなりません)。

 以上のような事態には、プログラムを開発する際に頻繁に遭遇するはずです。ですから、プログラム中で複数のスレッドを利用する方法を知っておくのはとても大切なことです。

13.1.2 マルチスレッドのためのライブラリやAPI

 マルチスレッドという概念は、C++やC++/CLI自体には含まれていません。マルチスレッドはライブラリや特別なAPIを利用することによって実現します。Visual C++ Express Editionで簡単に導入できるマルチスレッドのためのライブラリやAPIには次のようなものがあります。

  • ネイティブスレッド
      Win32 APIによって提供される、最も低水準なスレッドです。Unix系OS(Mac OS Xを含む)ではpthreadが同等のスレッド機能を提供していますが、互換性はありません。
  • スレッドクラス
      Boostのthreadや.NETのSystem::Threading::Threadは、スレッドを利用するためのクラスです。Boostのthreadは前述のWin32のスレッドとpthreadの両者を抽象化しているので、これを利用すれば、コードはポータブルになります*3
  • Intel Threading Building Block (TBB)
      スレッドセーフ(13.4.1項)なコンテナとアルゴリズムから成るテンプレートクラスライブラリです。スレッドを抽象化しているため、処理をスレッドに分割する方法等を考えなくても利用できます。
  • OpenMP
      マルチスレッドのためのAPIです。ここで挙げた中では最も高水準で、既存の逐次処理のコードを少し修正するだけで利用できます。
*3 Boost のthread と同等のものが、C++0x に導入される予定です。

 この章では、次節で紹介する例題(素数の列挙)を使って、Boostのthread(13.2節)と.NETのSystem::Threading::Thread(13.3節)、OpenMP(13.4節)を紹介します。


 INDEX
  [書籍転載]文法からはじめるプログラミング言語Microsoft Visual C++入門
  並列処理を行うための基礎知識(Visual C++)
  1.並列処理
    2.例題:素数の列挙

インデックス・ページヘ 「文法からはじめるプログラミング言語Microsoft Visual C++入門」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間