PDC 09資料で見る、2010年のMicrosoftの動き【最終回】

パラレルプロセッシングへ向かうWindows環境

 PDC 09では、2010年始めにリリースが予定されている開発ツールのVisual Studio 2010に関してもいくつかセッションがあった。その中でも、最も注目されるのは、パラレルコンピューティングへのシフトだろう。最終回の今回は、今後重要度を増していくパラレルコンピューティングにフォーカスする。


加速するCPUのマルチコア化

Microsoftは、Intelとも協力して、パラレルコンピューティングのインフラを整備している。IntelもC++を拡張した言語などがリリースされている

 IntelおよびAMDの両社とも、CPUのマルチコア化は進んでおり、ロードマップを見ると、2010年には8コア、12コアといったコア数のCPUも登場しそうだ。マルチコア化の流れは、どんどんと加速しており、2011~2012年には16コア以上のマルチコアCPUも実現する。Intelでは、研究用としてx86のCPUコアを80個搭載したサンプルも作成している。

 また、マルチコア化に加えて、マルチソケット化により、1台でメインフレーム並みの性能を持つサーバーが実現する。9月に米サンフランシスコで開催されたIntel Developer Forum(IDF)では、8CPUコアを持つNehalem-EXを4つ搭載したサーバーが展示されていた。Nehalem-EXは、1つのCPUコアを仮想的に2つのスレッドを動かすためのHyper-Threading機能を持っているため、物理的には32CPUコアしかないシステムでも、スレッドの動作という面では64個のCPUとして動作する。また、メモリも4つのCPUごとに持つNUMA型となっており、1CPUあたり256GBで、4CPUトータルで1TBのメインメモリを持つ。

 こういったサーバー環境が実現するにつれて問題になってくるのが、OSやアプリケーションがパラレルプロセッシングに対応しているかということだ。現在のCPUは、一つ一つのCPUコアは、ずばぬけて速いわけではなく、そこそこに速いCPUを複数組み合わせることで、CPU全体としてのパフォーマンスをアップしている。このため、OSやアプリケーションもマルチコアに対応した設計が必要になってくる。そうしないと、マルチコアCPUを生かしきることができない。


Windows 7/Windows Server 2008 R2に追加されたUMS機能

Windows 7(64ビット)/Windows Server 2008 R2に搭載されたUMSの機能概要

 Windows 7/Windows Server 2008 R2は、以前のWindows Vista/Windows Server 2008と比べるとマルチスレッドへの対応が進んでいる。

 Windows Vista/Windows Server 2008では、マルチスレッドを実行する上で、スレッドの切り替え(コンテキストスイッチ)が大きなオーバーヘッドとなっていた。Windows Vista/Windows Server 2008のOSカーネルでは、スレッドのユーザーモードとカーネルモードの両方を全体で1つのスレッドとして、一気に切り替えるようにしていた。しかし、これでは、オーバーヘッドが大きすぎるため、それほどマルチスレッドのパフォーマンスがアップしなかった。

 そこで、Windows 7/Windows Server 2008 R2では、User Mode Scheduler(UMS)という新しいマルチスレッドの仕組みを採用した。UMSでは、1つのスレッドのユーザーモードとカーネルモードを分離して、それぞれ切り替えられるようにした。

 これにより、ユーザーモードだけをスイッチしたときは、下のカーネルモードは以前のスレッドのカーネルモードが動作することになる。これにより、コンテキストスイッチの負荷が軽くなっている。

 さらに、切り替えられたユーザーモードで、システムコールが行われカーネルモードの動作が必要になったときに、そのスレッドのカーネルモードだけをスイッチする。

 UMSをサポートすることで、スレッドのスイッチにCPUとしては長時間待たされていたのが、必要な部分だけを入れ替えることにして、待ち時間(アイドルタイム)を少なくしている。

 ただし、この機能はWindows 7の64ビット版とWindows Server 2008 R2(つまり64ビットカーネル)でしかサポートされていない。

 もう一つ重要なのは、OSがNUMAを意識した設計になっていることだ。つまり、Windows 7/Windows Server 2008 R2のカーネルでは、CPUをグルーピングして管理している。つまり、マルチコアCPUを意識して、どのCPUコアは、どのグループに属しているかをはっきりさせている。これにより、CPUコアは、フラットに管理されているのではなくグループ化することで、どのメモリにアクセスするのが一番ペナルティがないのかを認識する。

 NUMAアーキテクチャでは、別のCPUが管理しているメインメモリにアクセスすることが最もペナルティになる。このため、OSが動作しているCPUコアに最も近いメモリを把握することで、CPUソケットを超えるメモリアクセスをできるだけ少なくしているのだ。


.NET Framework 4.0とVisual Studio 2010でパラレルコンピューティング環境をサポート

.NET Framework 4.0のリソースプールは、各スレッドにクエリが用意されることで、効率よくタスクを動かすことができる

 UMSなどによりマルチスレッドの機能が強化されたといっても、開発者が簡単に利用できなくては、良い機能も普及しない。そこで、Microsoftでは、.NET Framework 4.0とVisual Sudio 2010にパラレルコンピューティングを簡単にプログラミングできるようにしている。

 .NET Framework 4.0では、新しいConcurrency Runtime(ManagedとNativeの2つ)というライブラリが用意されている。このライブラリが内部でUMSを使用している。開発者は、UMSを意識せずに、パフォーマンスの高いパラレルプログラミングが行える。

 また、Managed Concurrency Runtimeでは、新しいスレッドプール機能が用意されている。.NET Framework 3.5では、1つのグローバルクエリがタスクを管理していた。しかし、.NET Framework 4.0では、スレッドごとにタスクを管理するクエリをおいて、効率よくタスクを管理することで、パフォーマンスをアップしている。

 同じような仕組みは、Native Concurrency Runtimeにも実装されている。これにより、C++などのコードでも、パラレルコンピューティングに対応したアプリケーションを構築することができる。

 さらに、Visual Studio 2010では、パラレル化に対応したデバッガーやパラレル環境を分析するConcurrency Analysisなどのツールが用意されている。開発者にとっては、手動ではチューニングしにくい、効率の良いパラレル化したプログラムが作成できる。

 Visual Studio 2010では、新しいプログラミング言語Visual F#が追加された。.NET言語のC#がC言語をベースして開発された。C#は、C言語と非常に近い言語体系を持つため、多くの開発者が言語を覚えやすかった。このため、Windows環境でのプログラミング言語としてはVisual Basicと同じく、C#もスタンダードなプログラミング言語として使用されている。

 F#は、関数型言語になっているため、マルチコアのCPU環境にとっては親和性が高い。C#もマルチコアCPU環境上で動作するプログラムを作成することはできるが、開発者が環境を意識してプログラミングする必要がある。しかし、F#では言語自体が関数型となっているため、開発者がマルチコアCPU環境を意識しなくても、下層で高いマルチスレッド化が行われる。

 F#は、当初Microsoftの研究部門であるMicrosoft ResearchでOcaml方言の言語として開発された。開発動機としても、マルチコアCPU環境において、最も開発しやすく、パフォーマンスの高いプログラミング言語ということで開発された。

 もう一つ重要なのがParallel LINQ(PLINQ)のサポートだろう。

 LINQ(Language INtegrated Query)といえば、.NET Frameworkで用意されたデータベースアクセスの仕組みだ。データベースにアクセスするには、SQL文などを利用する。LINQは、SQL文に似た構文によりクエリを作成し、データベースからデータを取得することができる。

 便利なのは、LINQはプログラミング言語の中に記述できるため、開発者はADO.NETやSQL文を使ったデータベースアクセスのためのプログラムを記述しなくてもいいところだ。開発者にとっては、非常に簡単な記述でデータベースにアクセスするプログラムを記述できる。

 PLINQは、LINQの機能をマルチコアCPU環境に拡張している。つまり、データベースに対するクエリを並列化(パラレル化)することで、パフォーマンスをアップすることができるというわけだ。開発者がパラレル化を意識しなくても、PLINQでデータベースのクエリを行えば、PLINQでデータベースアクセスが自動的にパラレル化を行ってくれるのは便利だ。


将来のシステムとは?

 Microsoftが現在開発しているDryadLINQは、マルチノードのクラスタサーバーにまで拡張したものだ。PLINQは、マルチコアCPUレベルでのパラレル化だが、DryadLINQは、複数サーバーを束ねる巨大なサーバーシステム上で、効率よくデータベースアクセスができるようにするものだ。

 これは、HPCなどが利用されているデータマイニング、イメージプロセッシング、シミュレーションなど、膨大なCPUパワーでデータを扱うような作業に向いている。


PDC 09で紹介されたMicrosoftのパラレル関連のテクノロジー。青がOSなどのインフラ。赤が.NET Framework4.0やVisual Studio 2010で搭載されたライブラリや機能、言語。オレンジは、研究開発中のものDryadは、複数のHPC Serverを束ねる形で用意される。開発者は、DryadLINQを利用することで、HPC Serverに分散されたデータベースをパラレル化してアクセスできるDryadLINQの概念図

 また、LINQを利用したReactive Extensions for .NETというライブラリも開発が進んでいる。

 将来計画で注目されたのは、Axumというプログラミング言語を開発していることだ。Axumは、データを持つDomain、データの受け渡しを行うAgent、Domain同士を接続してデータを受け渡すChannel、データフォーマットのSchemaといった要素によって作られている。言語としては、F#と似ている。

 最大の特徴は、Domain同士が共有メモリを持たないことだ。このため、マルチコア化が進んで、1台のサーバーに数百個のCPUが存在しても、それぞれが独立して動作するため、依存関係や切り分けも簡単になる。Axumは、インターネットのWebをモデルとして考えられたプログラミング言語だ(以前はMaestroという開発コードだった)。

現在のPCでは、GPUはとんでもないパフォーマンスを有している
CPUとGPUでは、これだけコアの構造が異なる。GPUは汎用ではないが、SIMDなどを使った演算が得意だ

 最後にパラレルコンピューティングという面で注目されているのが、GPGPUだ。GPGPUは、GPUのベクタープロセッサ上で、シミュレーションやイメージプロセッシング、AIなどのプログラミングを動かそうというものだ。GPGPUをサーバーで利用すれば、特定のプログラムは飛躍的にパフォーマンスがアップする。

 Windows 7のDirectX 11には、Direct Computeという機能が用意されている。この機能を利用して、PDC 09のデモでは、AMDのPhenom IIとAMDのHD5870を組み合わせたPCで、銀河のN Bodyシミュレーションなどが行われた。このようなシミュレーションには、CPUよりもGPUを使った方が高速に処理できる。

 現状では、HPCなど特別な分野でNVIDIAのGPUが利用されたり、デスクトップPCではビデオのエンコードやトランスコードなどに利用されたりしている。今後は、一般的なサーバーでもGPGPUの機能を使って、アプリケーションが構築されるだろう。




 マイクロソフト株式会社は2010年2月23日・24日の2日間、「Tech・Days Japan 2010」を、東京・お台場のホテル グランパシフィックLe Daibaで開催する。このTech・Daysは、PDCの日本版として行われるものなので、特集で取り上げた内容に関心を持った方は参加してみてはどうだろう。



(山本 雅史)

2009/12/25/ 00:00