CUDAとGPUコンピューティングの広がり

2010年7月30日(金)
平野 幸彦

CUDAの普及

2006年にG80世代のGPUとともに発表されたCUDAは、当初は大学や独立の研究機関などを中心に、新しい計算手法あるいは計算の加速方法として注目を受け始めました。

研究者や専門家の皆さんが自らの研究課題をCUDA Cを使ってプログラミングすることにより、これまで数日間かけて行っていた計算内容を数時間に短縮することが可能になりました。

また、GPUの高い計算能力が新たな研究課題への取り組みを可能にし、GPUコンピューティングの学術研究目的への利用が広がりました。

その研究成果は各専門分野の学会やNVIDIAのCUDAゾーンなどでも公開されてきました。

このような状況の中で、2008年にCUDAの利用方法について、1つの転機が訪れました。

2008年6月に米Elemental Technologiesが発表した「BadaBOOM Media Converter」のトランスコーディングがCUDAで最適化されたり、2008年8月に株式会社ペガシスが「TMPGEnc 4.0 XPress」でフィルタリングをCUDAで最適化したことなど、一般消費者向けビデオ・エンコード・ソフトウエアがその発端でした。

米Elemental TechnologiesのCEO、サム・ブラックマン(Sam Blackman)氏は次のように述べています。

「世界中の多くのユーザーは、YouTubeなどのビデオ共有サイトへの投稿や、iPodなどの人気のメディア・プレーヤへのダウンロードを行うため、ホーム・ビデオを変換するのにどれほど時間がかかるかを知っています。Elementalは、2008年8月に提供開始予定の一般消費者向けビデオ・アプリケーション、BadaBOOM Media Converterを開発しました。GeForce GPUの超並列汎用コンピューティング・アーキテクチャを活用することで、CPUのみを実装したシステムの18倍のスピードで、高品質ビデオを変換することができます。この比類のない性能向上は、当社のRapiHD Video PlatformがNVIDIA GPUの活用を念頭に開発されたことによります」

それは、これまでのような専門家が自らプログラミングすることによるCUDAの利用だけではなく、一般消費者が表面的にはアプリケーションを使用するだけで、間接的にCUDAを利用することができ、GPUコンピューティングの恩恵を得ることができるという最初の実例でした。

ビジュアル・コンピューティングのメガイベント"NVISION08"

このような動きに合わせて、2008年8月下旬に米国サンノゼで開催された"NVISION 08"は、NVIDIAが従来から推進してきたビジュアル・コンピューティングの発展とともに、GPUコンピューティングの現状と今後の可能性を世の中に示すものでした。

このイベントは、ノンストップLANパーティ・ゲームのギネス世界記録達成など、さまざまな意味で話題になりましたが、特に閉会セレモニーの中で行われた、米国のTV番組"MythBusters"でおなじみのJamie HynemanとAdam Savageによる、GPUの並列プロセッシングのデモは、世界中で注目を浴び、その後日本の主要民間テレビ放送局のゴールデンタイムでも何度か取り上げられました。

内容は、ペイント・ボールと呼ばれる何色かの塗料の入ったボールを1102個の銃から同時に発射することにより、瞬時にモナリザの絵を完成させるというものです。

図1: テレビで放映されて注目を集めたGPUによる並列プロセッシングのデモ(クリックで拡大)

当時のNVIDIA主席研究員(現NVIDIAフェロー)デービッド・カーク(David B. Kirk)が、このイベントの初日に行ったキーノート・スピーチの最後に登場する、"CUDA Everywhere !" という言葉は、CUDAとGPUコンピューティングが学術研究用途から産業界、一般消費者の日常的な使用へと用途が拡大していく状況を象徴するものでした。

DirectComputeによるCUDAの暗黙的な利用

さらに、2008年11月に発表されたDirectCompute は、DirectX 10世代以降のGPUに対応したWindows のGPUコンピューティング用 APIとして、CUDAの一般利用への広がりをさらに加速しました。

例えば、GPUコンピューティングやIT全般にあまり詳しくない人がいて、Windows 7とNVIDIA のGPUが搭載されたパソコンを趣味で使用しているとしましょう。

そんな彼は、普段からDirectXの存在すら意識したことがなく、「DirectCompute」という言葉を伝えても、「直接計算するなら電卓だよ」、といわれるだけかもしれません。

しかし、もし彼が自分で録画したHDTV(高精細テレビ)のビデオ・クリップを普段持ち歩いている携帯用ビデオ再生機器に取り込むためにパソコンに接続し、ビデオ・クリップをその携帯機器に「ドラッグ&ドロップ」して、コピーが即座に完了したとしたら、その時点で彼はCUDAとGPUコンピューティングの利用者の仲間入りしたことになります。

なぜなら、この場合に「ドラッグ&ドロップ」によって発生する内部処理は、単なるファイルのコピーではなく、GPUコンピューティングを使用したトランスコード(ビデオ・フォーマットや解像度の変換)がコピーと同時に自動的に行われているからです。

「ドラッグ&ドロップ」の操作により、まずDirectComputeのAPIが呼び出され、CUDAプラットフォームを経由して、コンピュート・モードへの切り替えの命令がGPUに伝達されます。

例えていえば、それまでグラフィックスのハッピを着て、低周波数クロックで地球環境保全に貢献しながら、デスクトップ画面のアップデートの仕事を軽く受け流していたかもしれないシェーダたちは、切り替えの命令を受けたとたんに、クロック周波数を通常状態に戻しながら気合を入れ直し、即座にコンピュート用のジャケットに着替え、降り注ぐスレッドの数々をチームワークよく分担しながら一心不乱に処理し続けます。

外界では「ドラッグ&ドロップ」が終わり次の作業に入ろうとしているころには、HDフォーマットのビデオ・クリップが、ターゲットである携帯用ビデオ再生機器がサポートするフォーマット(例えば、低解像度のH.264)に既に変換され終わり、仕事を終えたCUDAコアたちは、元の地球に優しい状態に戻っています。

図2: CUDAのシステム・アーキテクチャ(クリックで拡大)

CUDAといえば、CUDA Cによるプログラミングだけが注目されがちですが、それはあくまでもCUDA GPUコンピューティングの1つの入り口でしかありません。

DirectComputeに限らず、GPUコンピューティングを支えるインフラストラクチャとして、CUDAの役割や利用方法は日々進化しています。

CUDA の現状

CUDA Cによるプログラミング以外の、CUDAの使用例としてDirectComputeを取り上げましたが、ここでCUDAの現状とその全体像を整理してみましょう。

  • CUDA対応GPUの普及
    • G80以降出荷されたすべてのGPUがCUDAに対応
    • これまでのCUDA対応GPUの出荷数は、全世界で2億個以上
  • 標準APIへの対応
    • DirectCompute
  • プログラミング言語の対応
    • CUDA C/C++、CUDA Fortranなど
  • 業界標準プログラミングの推進
    • OpenCLの早期対応と標準化への貢献
  • コンピュート用ライブラリの充実
    • CUFFT、CUBLAS、
    • 各種アクセラレーション・エンジン(SceniX 、CompleX、OptiX、PhysXなど)
  • 各種ISVアプリケーションのCUDA化の推進
    • 生物化学系、映像処理系、金融系、設計支援ツール
  • デバッグ環境の充実
    • Windows Visual Studio 環境で動作するParallel Nsight
    • Visual Profiler
    • Linux上で動作するcuda-gdb
  • スケーラビリティと互換性
    • ラップトップPCから、HPC用のTesla製品まで同一のアーキテクチャ

プログラミング言語や標準APIへの対応

"CUDA C"のプログラミング手法については、第1回で多少ふれましたが、ほかにもFortranやJavaといった言語についても同様にサポートしています。

また、CUDA Toolkitに含まれている、高速フーリエ変換(FFT)や倍精度汎用行列乗算(DGEMM)を含む基本線形代数サブプログラム(BLAS)をはじめ、それ以外の各種ライブラリやミドルウエアについてもCUDAへの対応が着実に進んでいます。

図3: CUDAの並列処理アーキテクチャ(クリックで拡大)

OpenCLの推進

CUDA CがNVIDIAのGPU専用のプログラミング言語であるのに対し、同じくC言語をベースにしながら特定のアーキテクチャに依存せず、マルチコアCPUも含めた異種混合の並列コンピューティングのためのフレームワークとして、OpenCL 1.0の仕様が2008年12月にKhronos Groupから正式に発表されました。

NVIDIAは、CUDA環境の上でのOpenCL 1.0のサポートをいち早く発表し、2009年4月に業界初となるOpenCLドライバとSDKの提供を開始しました。

OpenCLの標準化は、OpenGLやその他のビジュアル・コンピューティングのプラットフォームとともに、Khronos Groupが業界を取りまとめていますが、その代表者であるNeil TrevettはNVIDIAのモバイル・コンテンツ担当の副社長であり、NVIDIAもグループのメンバーとして、業界の標準化に貢献しています。

2009年の12月に横浜で開催されたSIGGRAPH ASIA 2009に参加したNeil Trevettは、Khronos Groupの代表者として、またNVIDIAの副社長として、それぞれの立場で最新の技術に関するスピーチを行いました。

図4: OpenCL規格を定めているKhronos Group(クリックで拡大)

OpenCLの登場によりCUDA Cの存在意義が無くなるのではないか、という質問をしばしば受けることがありますが、この2つの開発プラットフォームは使用者や使用目的が異なるため、NVIDIAとして、双方ともにCUDA開発環境への重要なエントリー・ポイントとしてサポートをしています。

CUDA Cは、最新のGPUの機能やアルゴリズムをいち早く取り入れ、パフォーマンスや使いやすさをタイムリに向上させるためのプラットフォームであるのに対し、OpenCLはプログラミングの標準化が主目的であり常に最新の機能がサポートされているというわけではありません。

CUDA CとOpenCLには、別々の前工程コンパイラがありますが、それぞれのコンパイラが目指しているのは、中間生成言語であるPTX(Parallel Thread eXecution)レベルでの最適化です。

特にOpenCLの場合は同じソースコードで他社GPUやマルチコアCPUとの競合がありますので、NVIDIAとしても当然パフォーマンスの最適化を目指しています。

いったんPTXまで落ちてしまえば、共通の後工程のコンパイラがすべてのPTXコードを処理しますのでソース言語の違いによる影響はありません。

ただし、一般的にOpenCLのコードがCUDA Cのコードよりも得られるパフォーマンスが低い場合があります。その理由を一言でいえば、標準化の足かせが原因ということになります。

新しく追加されたGPUの機能がOpenCL言語の標準化を待つために使えなかったり、あるいは特定のアーキテクチャ固有の機能であるためにOpenCLではサポートされないことがあるため、ある時点でCUDA Cでは可能なことがOpenCLではできず、別の手法をとらざるを得ないため、結果的にパフォーマンスの差ができてしまうということがあります。

図5: OpenCL(低レベルAPI)とCUDA C(高級言語)の関係(クリックで拡大)

デバッグ環境の充実

Microsoft Visual Studio に並列コンピューティングを組み込んだ業界初の開発環境として、NVIDIA Parallel Nsightが2010年7月に正式にリリースされました。これにより、CPUとGPUのコードを同一のプラットフォームで同時に開発できる環境が整いました。

GPUのコードとしては、GPUコンピューティングだけではなく、DirectX 10やDirectX 11を使用したグラフィックス・プログラムの開発やデバッグ、最適化が可能になり、統合的な開発環境が整ったといえます。

また、Visual Profilerは、GPUのカーネルやメモリ・データ転送の監視、GPUごとの複数コンテキストのプロファイリング機能等を備え、従来からLinuxをはじめWindows やMacOSなど各種OSに対応しています。

cuda-gdb は、標準のGNUプロジェクト・デバッガーへの追加機能として、Linux環境でCPUとGPUの同時デバッグを可能にします。

図6: CUDA環境向けのデバッグ・ツール(クリックで拡大)

ISVアプリケーションのCUDA化

GPUコンピューティングの広がりを支えるもう1つの重要な側面は、さまざまな業界で利用されている主要ISVアプリケーションのCUDA対応です。

特に、生物化学系、生物情報科学系、映像・画像処理系、金融系、エンジニアリング系などの分野では、いくつかの主要アプリケーションについて、既にCUDA対応が発表されています。

まだ発表されていないCUDA化進行中のアプリケーションも数多くあり、今後の展開に期待が寄せられています。

図7: 増え続けるCUDA対応アプリケーション(クリックで拡大)

CUDA SDKとスケーラブルなCUDAプログラミング

ここに1枚のブート可能なライブDVDがあります。内容はLinuxのUbuntu10.04をベースに、CUDAドライバ、CUDAツール・キット、CUDA SDKをインストールしたもので、詳細は以下のとおりです。

  • OS : Ubuntu
    • リリース 10.04
    • カーネル Linux 2.6.32-22-generic
    • GNOME 2.30.0
  • NVIDIA Driver and CUDA
    • CUDA Driver : 195.36.24
    • CUDA Toolkit 3.0 for Linux64
    • CUDA SDK 3.0 for Linux

このライブDVDを使用して、いくつかの典型的なプラットフォームの上で、OSのブートやCUDA SDKに含まれるCUDAサンプル・プログラムを使った動作確認を行い、CUDAプログラミングのスケーラビリティと互換性を検証したいと思います。

図8: LinuxのライブDVDを使ってCUDAのプラットフォーム互換性を検証(クリックで拡大)

使用したシステムは、以下の3種類です。

  • ラップトップPC : Dell Latitude D830
    • GPU :G80世代のQuadro NVS 140M(16コア)
  • モバイル・ワークステーション:Lenovo ThinkPad W700ds
    • GPU :G90世代のQuadro FX3700M(128コア)
  • フロア・スタンドのノーブランド自作マシン
    • GPU :Fermi 世代Tesla C2050(448コア)

図9: CUDAの動作検証に用いた3種類のプラットフォーム(クリックで拡大)

結果は、同じライブDVDがすべてのプラットフォームでブートし、N体粒子の重力相互作用をシミュレーションするN-Bodyや海面の波の動きを高速フーリエ変換を使用して表現するOceanFFT、フラクタルのMandelbrotなどのサンプル・プログラムが正常に動作することが確認できました。

つまり、G80世代のラップトップ用ローエンドGPUから、Top500第2位のスーパー・コンピュータで使用されている最新Fermi世代のGPUまで、全く同じOS環境とグラフィックス・ドライバ、CUDAツール・キットのライブラリを使い、同じCUDA SDKのサンプル・プログラムが、パフォーマンスや倍精度浮動小数点演算など一部の機能の違いこそあれ、GPUコンピューティングを使って同じように動作することが確認できたということです。

図10: CUDA SDKで開発したサンプル・アプリケーション(クリックで拡大)

"Compute Capability"とCUDAプログラミングの互換性

GPUの機能は、世代を経るにつれ、そのパフォーマンスとともに進化し続けていますが、それぞれのGPUがサポートする機能を表す指標として、"Compute Capability"というリビジョン番号が定義されています。具体的な対応表は、最新のCUDAプログラミング・ガイドなどに掲載されていて、CUDAのバージョンアップに合わせてアップデートされています。

例えば、倍精度浮動小数点演算機能のサポートは、Compute Capability 1.3以降になりますので、1.2以前のGPUではその機能は使用できません。

バイナリ・コードのレベルの互換性は、同一メジャー・リビジョン番号内(Compute Capabilityの整数部分。例えば1.0から1.x)でのみ保たれているのに対し、中間生成言語であるPTXのレベルでは、1.0から2.xまですべてのリビジョンで上位互換性が保たれています。

図11: CUDAは上位互換性を保ちながらバージョン・アップしている(クリックで拡大)

さらなる発展と広がり

このように、CUDAとGPUコンピューティングは、2006年の発表からほぼ4年の歳月を経て、スーパー・コンピュータの主要構成要素としてのHPC分野での利用から、各種デザイン・ツールや新商品開発のためのシミュレーション・ツールといったプロフェッショナル用途での利用、そして一般消費者の娯楽目的の利用にいたるまで、幅広い利用分野と利用形態が整いつつあります。

ただ、現状はまだまだ発展途上の段階であり、今後さらに新規分野でのGPUコンピューティングの利用や、既存のアプリケーションの新たなCUDA対応といったニュースが今後ますます増えてくると思われます。

大学や研究機関の研究者や技術者をはじめ、アプリケーションやライブラリを開発するソフトウエア・ベンダー、サーバーやワークステーションを提供するOEMシステム・ベンダー、システム・インテグレータ、コンサルティング・ファームなどとの協力や協業によって支えられてきたCUDAとGPUコンピューティングは、今後もオープンソース・コミュニティも含めたIT業界全体とともに発展し続けます。

NVIDIA Tesla Quadro事業部 GPUコンピューティング担当 シニア・エンジニア

外資系コンピュータ・メーカーにてPCグラフィックス・サブシステムやASICの設計開発、経営企画部門、製品開発プロジェクト・マネージャなどを経験し、2007年NVIDIA入社。現在、GPUコンピューティングの技術的なサポートを担当。
 

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています