
コンピュータ業界は今、着々と並列化への道を進んでいます。
ディープラーニングの流行から世間ではAIが注目を集め、スマートフォンのカメラなどの発展により世界は高解像度の画像や動画で溢れています。こういった大規模なデータの処理は既存のCPUのみでは難しく、GPUを活用していく必要があるでしょう。
近年はGPUの性能が進化し、様々な機器に組み込めるまでに小型化し、個人や小規模な企業でもそれなりの処理ができるマシンが手に入るようになってきました。
「この時代の流れに乗ってGPUを活用したい。でもGPUを扱うのは難しそうで分からない。」そういった悩みを抱えている方はたくさんいるのではないでしょうか。
そのようななか、ゲームエンジンやミドルウェアなどを手がけるシリコンスタジオが、GPUとそのGPU上でプログラムを動かすためのCUDAというソフトウェアプラットフォームを使った開発の受託を手がけ、実績をあげています。
今回はそのCUDAにフィーチャーし、実際にCUDAを用いたさまざまな開発プロダクトに携わっているシリコンスタジオのエンジニア フレドリック ヘルツベルユ(Fredrik Hertzberg)氏と、CUDAの開発元であるNVIDIAのシニアディレクター 橋本和幸氏にインタビュー。どのような業務がCUDA、GPUを使った並列処理に向いているのか、どういった仕組みなのか、また今後のコンピュータ業界の流れなど気になるお話を伺いました。
また、本記事の最後には読者プレゼント企画も用意しています。ぜひ最後までお読みください。
――本日はよろしくお願いします。はじめに、簡単にお二人の自己紹介をお願いします。

橋本和幸氏:(以下、橋本)私は長くグラフィック業界にいまして、最初はSymbolicという会社でコンピュータグラフィックスの担当をしていました。当時は放送局関係や制作プロダクション、そういったところにシステムを納入する際の、ソフトウェアの調整やカスタマイズをしていました。
その後、株式会社スクウェア(現スクウェア・エニックス)に転職してゲームの三次元化を担当し、『ファイナルファンタジーVII』を作りました。次にアメリカのエレクトロニック・アーツ社でプレイステーション3の技術開発を担当した後、ハワイで独立をしてAvatar Realityという会社を創業。当時流行っていたこともあって、そこでBlue Marsというバーチャルワールドを開発しました。それからはリーマンショックなどがありまして、自分の会社を断念してNVIDIAに入社。入社当時はクラウドゲーミングを担当しており、今はアナリストにいろんなNVIDIAの技術を紹介、説明するという仕事をしています。
――ありがとうございます。続いて、フレドリックさんお願いします。

フレドリック ヘルツベルユ氏(以下、フレドリック):フレドリック ヘルツベルユと申します。スウェーデン出身です。もともと、ストックホルムのエリクソンで働いていました。その後は中国の北京宏剑公司という会社で、HPC(ハイパフォーマンスコンピューティング、高性能計算)に関する仕事をしていました。その中でも自分は特に、量子化学のシミュレーションを並列化する仕事を担当していました。それから日本に来て、シリコンスタジオで3年間働いています。今は物理シミュレーション、画像処理、画像認識などを担当しています。CUDAだったり、他のGPGPU(*)だったり、使うものはいろいろですが、物理シミュレーションはCUDAを使っています。
*GPGPU:General-Purpose computing on Graphics Processing Unitsの略。GPUを汎用的な計算の目的で利用すること
――ありがとうございます。それでは橋本さん、まず「CUDAとは何か」について簡単に説明していただけますでしょうか。
橋本:CUDAというのは、NVIDIAが開発しているGPU上でプログラミングをするためのソフトウェアプラットフォームになります。含まれるものとしては、CUDAを実行形式に変えるコンパイラみたいなもの、それをサポートするSDK、ライブラリ、あとはデバッグツール群ですね。
――CUDAを導入することによって、何がどう変わるのでしょうか?
橋本:一般的に行われるプログラミングというのは、いわゆる順次処理に適したものです。それを並列化していくなかで、単に複数のプロセッサで動かせばいいということではなく、いかに無駄なく並列化するのか、というのが重要なのですが、これが非常に難しい問題なんですね。特にNVIDIAのGPUには非常に多くのプロセッシングユニットが含まれています。そしてCUDAにはこれを無駄なく活用するためのいろいろなテクニックが組み込まれています。
――CUDAでNVIDIAのGPUを活用できるとのことですが、そのGPUについても簡単に説明していただけますでしょうか。
橋本:GPUについては、最初にその流れをご理解いただくといいかなと思います。もともとはコンピュータグラフィックスをハードウェアで高速化しようという目的でグラフィックチップというものが作られました。たくさんのピクセルの値を全部計算しないといけないので、実は絵を描画するのは大変なプログラムなんです。この計算をするのに普通のCPUで行うと途方もなく時間がかかるので、これをなんとか並列化できないかと。
グラフィックスは、スクリーンごとに切り分ければ類似性が高い割に独立性も高く、個別に計算できるということで、並列化がかなりうまくいくターゲットなんです。そのため、ハード化してグラフィックチップやGPUにすると、それはCPUで計算するよりも圧倒的に高速に計算できるようになるんですね。これを座標計算や光源計算ができるようになったレベルから、NVIDIAがGPUと呼び始めました。
――GPUという名称はNVIDIAが最初に呼び始めたものなのですか。

橋本:そうですね。それまではビデオプロセッサとかラスタライザとか呼ばれていました。基本的にはラスタライズするユニットであって、そのなかに空間の計算や行列計算をするユニットは入っていなかったんですね。画素のオペレーションだけのユニットだったので、GPUとはちょっと呼べないものです。それに対して、NVIDIAでそのマトリックス(行列)計算をするものとラスタライズをするものを一緒にしたので、これからはGPUと呼ぼうということになったのが最初だったと思います。
そのなかで、今度はGPU上でプログラミングをしようという動きが出てきました。GPUで行う計算はもともと光源計算や座標の変換しかできなかったのですが、そういったものもだんだん複雑化していくんですね。いろんなことやるのにすべてを半導体の回路としてハード側で担うのは無理ですから、これをプログラマブルにしようと。
シェーダーと呼ばれる色を計算するものがありまして、例えば入力ベクトルや面の向きといった情報から色を計算するんですけど、その計算式をプログラムできますよ、というのが確か最初に出てきました。そして世の中にはいろいろな人がいるので、それを使って無理に物理計算をしようとする人が現れるんですね。すると、入力値を全部色に置き換えてGPUに与えてシェーダー技術を使って計算したら物理計算できるじゃん!という人が出てきたりして。だったらその部分をもっと強くしていこうということで、NVIDIAはCg(*)と呼ばれるものを最初に作りました。それでGPUを使った計算ができるようになったわけですが、もっとちゃんと作ろうという流れでCUDAが生まれました。
* Cg : NVIDIAが開発していたシェーディング言語。ここではComputer Graphicsのことではない
だから最初はGPUで計算するというのは非常にトリッキーなプログラミングだったんですよ。画素のリードとライトしかできないので、画素データで計算ユニットに与えて、計算させて、それを取り出すみたいなことをやっていました。それを何か使いたいという話が出てきたので、「体系的に作るべきだろう」ということから生まれたのがCUDAになります。
――CUDAの仕組みといいますか、GPUをどのようにして利用しているのでしょうか?
橋本:CUDAのプログラムを実行するにあたって、GPUはグループ化されているんですね。GPUにはたくさんのコアがありますが、プログラムは1個1個のコアを認識するのではなくて、ある一定の数でグループ化されていて、その各々のグループに対してセットのオペレーションを振り分けていくんです。
これはどういうことかと言うと、コンピュータを実行するためには計算だけではなく、メモリのリードライトが必要です。実はこのメモリのリードライトってものすごく時間かかるわけですよ。だからプログラムをコアで実行しようとすると、最初にやるのはメモリリードなんです。まず、データが来るまでにすごく待ちます。計算をしたら次のデータがほしいので、また待たないといけません。すると時間軸上でプロセッサが動いてるのはココとココ(下記の画像の、上側のオレンジの部分)だけになるんです。
GPUではテクスチャ処理などを実行するときに、ピクセルを順次に計算していくのですが、次のピクセルで読まなきゃいけないデータはある程度予測できるんです。必要なデータに事前にメモリーリクエストを出すんですよ。いわゆるスケジュールドアクセスですね。

同じようなテクニックを使ってCUDAでも次の処理に必要なデータを先読みしようと。そうすることによって、計算処理があって、これを10スレッド走らせるときに、クロックを少しずつずらして実行していくんですね。そうするとプロセッサが無駄なく回るわけですよ。こういった処理をより書きやすくしたのがCUDAというわけです。
ちなみに、CUDAの形式で書けばなんでも速くなるかというと、そうではありません。各人は事前に、どこにどういうデータがあって、どういう風に割り当てて、どういう風にアクセスさせていくかということを設計しなければダメですね。CUDAの場合は設計が一番重要になってきます。
――CUDAはどういった市場で多く使われているのでしょうか。
橋本:現状でCUDAが最も多く使われているのは、やはりHPC(ハイパフォーマンスコンピューティング)にスーパーコンピュータ関連、あとは各種シミュレーション系ですね。最近ですと、ディープラーニングというAIの技術が随分流行ってきていて、この分野でも計算パワーを支える技術となっています。
――産業の業界では、どういったところで使われることが多いのでしょうか。
橋本特に産業に依存することはないんじゃないかと思います。現状はやはり計算量が必要なアカデミック系、インダストリー系でもいろいろなシミュレーションをされると思うので、そういったところでCUDAは幅広く使われています。
――CUDAがゲーム関係で活用される場があるとすれば、どのようなシーンになるのでしょう?
橋本:NVIDIAが公開しているPhysicsという物理シミュレーションのライブラリがあるのですが、これが使われているのであれば、CUDAが使われているということになります。

フレドリック:それとDirectX(*)では、先に書いたものは下に表示しないといけないという描画上の制約があります。普段はDirectXでいいのですが、ちょっと変わったことをするステージなんかで、CUDAに任せたほうがいいケースもあります。そういう場面ではコンピュータシェーダーを使っている人が多いのですが、CUDAを使うと細かい依存性をもっと詳しく強調できるので、それはスゴイところだと思います。CPUだと上から下へ書いていくので、依存性がバラバラでいろいろな並列化はできません。
*ゲームや音楽、映像などマルチメディア関連の処理をより高速に使用できるようにするためにマイクロソフトが Windowsに組み込んでいるAPI
橋本:計算処理をするときに、DirectXのコンピュータシェーダーとかだと順次に実行されていくので、何かが終わるのを待ってしまっているんですね。そうするとさっき言ったように、順次に全部きれいに時間軸を埋めていくということができなくて、スキップがかかっちゃったりすることがあるんじゃないかな、と思います。どうしてもDirectXだと、描画がメインなんで、1フレームの計算に収まらないものが書きにくいんじゃないかと思います。
――CUDAを有効活用すれば、時間がかかる処理以外を並列化して進めていけるので、速くなるということでしょうか?
橋本:CUDAを使うと、描画処理を行っているGPUとコンテクストを切り替えなければならず負荷になります。そのため、切り替えが多く発生するケースではよくないですね。
――では、やはり使える場面は限られてくると。
橋本:そうですね。やはりシステム全体の設計として、どんな問題があって、どのくらいの計算が必要で、秒間どのくらいのペースで計算が必要で、という全体を設計してからでないとなりません。やはり効率的なプログラムを書くには、コンピュータができることを可能な限り理解・把握しておくことが大事かなと思います。
――CUDA以外にも、例えばOpenCLですとか、GPGPUはいくつかありますが、その中でのCUDAの強みを教えていただけますでしょうか。
橋本:CUDAは、NVIDIAのGPUの機能を最大限活用できる、というのを目標に設計しています。ですので、新しいGPUのアーキテクチャが出てきますと、それに伴った新しいCUDAのバージョンが出てきます。最近ですと、例えば、メモリをユニファイドで扱えるとか、実行中のフラグメントシェーダーみたいな、実行中のプログラムをGPU側のカーネルでもう1個発行できるダイナミックパラレリズムなど、CUDAであればこういったものが即活用できます。CUDAはNVIDIAのGPUと共に成長しており、それが強みだと思います。
――NVIDIAのGPUを使う場合にはCUDAが一番良いということですね。
橋本:そうですね。GPUを使うからにはやはり効率的な計算をしたいという目的があるはずなんです。そのためには僕はCUDAを使うのがベストだと思います。
――それでは次に、フレドリックさんの方にお聞きしたいのですが、シリコンスタジオでCUDAを受託開発することになった経緯や理由をお聞かせいただけますでしょうか。
フレドリック:私たちは長年CGの仕事を続けていて、以前からゲーム以外にも様々なお客様とCG関係の仕事をしています。CGとCUDAを使ったシミュレーションはもともと親和性が高く、お付き合いのあったお客様の中で、CUDAを使って高速化したいといったニーズが自然と発生してきました。「シリコンスタジオさんはGPU得意だから、CUDAもできるよね?」というご相談を頂いて、CGだけじゃなくて、そちらの方の案件にも広がってきたということです。
――今後シリコンスタジオとしては、CUDAを使ってどのようなことをしていきたいと考えていますか。
フレドリック:もともと物理シミュレーションや画像処理、画像認識などが圧倒的に多いのですが、強いて言えばニューラルネットや組み込みですね。シリコンスタジオにはGPU組込系のシステム開発者が多く在籍しています。最近まで組み込みのシステムでできなかったことが近年のGPUの発展でできるようになったので、その最適化をしたり、GPUをフル活用したりしたいです。昔はサーバー、スーパーコンピュータでしかできなかったシミュレーション分析などが組み込みのGPUでもできてしまう、それほどの処理能力が得られるようになってきているんです。
――その結果出てきた案件などはありますか?

フレドリック:いくつかありますが、残念ながらすべて非公開の機密情報です。多くの会社は他の人がやらないことをしています。自社独自のデバイス用にカスタマイズ開発したいのに、大きなライブラリ、フレームワークを使えなくて……といった相談の案件は多いです。フレームワークの多くはいろいろなハードで動かすため、汎用的に設計されています。それでは個々のデバイスに対して少しトレードオフがあるため、そのデバイスの100%の力は発揮されません。カスタムでNVIDIAのGPUに限らず特定のGPUを100%使いたいといった時に、私たちは細かい最適化ができるので、今後の展開としてもカスタマイズ性の高い案件を中心に手がけていくことになると思います。
それから先ほど話にあったとおり、ディープラーニングによる画像認識は今とても話題です。ただ、そのためにトレーニングデータを大量に用意することが大変で、普通はいろいろな写真や動画を撮ったりして、これはクルマだ、道だ、ヒトだ、と全部のオブジェクトにラベルを付ける必要があります。しかし、それは大きなコストであることは間違いないので、CUDAとは離れますが、現実で撮ったものではなくMizuchi(*)などのリアルタイムの描画エンジンを使って3DCGを用意し、トレーニングデータを量産的に作る案件も増えてきています。そうするとラベリングが不要になり、大きなコスト減に繋がります。
* Mizuchi : シリコンスタジオが開発しているリアルタイムレンダリングエンジン
――こんな悩みを持っている企業の方にはぜひ相談してほしい、といった思いなどはありますでしょうか。
フレドリック:やはり現状では性能、処理能力が足りないと感じている企業の方に利用していただきたいです。それから、デバイス開発は上手いけど、並列化の低水準言語は普段使ってないので、その開発をなんとかしたいと思っている方はぜひ相談してほしいですね。
プロトタイピングならCPUの方が早いのですが、真面目に最適化しようと思うならGPUの方が簡単だと思います。CPUの最適化は並列化しかないですが、その道具が少し足りない感があります。システムは並列化のためのものではなく、それほど組み合わせに一貫性がありません。キャッシュのfalse sharing、ベクトル命令内の分岐などは、CPUで最適化するのは少し大変です。ですから、真面目に最適化しようとしたら、最初からCUDAでやった方がいいと思います。そんな最適化を私たちシリコンスタジオは得意としています。
――橋本さんにもお聞きしたいのですが、どのような悩みを持つ企業にCUDAはオススメなのでしょうか。
橋本:やはり、計算リソースが多く求められるアプリケーションかなと思います。GPUが得意なのは、シンプルな計算を大量にこなすということです。そういう問題をCPUで処理しようとするとすごくお金がかかると思うんですよ。ですので、そういったものはCUDAに移されたほうがいいのかな、と。それから考えると、計算リソースが求められることはデータが多いということなので、膨大なデータに対する計算処理が必要な業務やアプリケーションであればGPUを活用するのがお得だと思います。

フレドリック:先ほど、特に産業には依存しないとお話いただきましたが、最近のトレンドはあるんですか?
橋本:コンピュータは計算するためのものですが、インプットがないと何もできないわけですね。人間にとってわかりやすいインプットのデータだからだと思うんですけど、動画や画像は多く使われるようになってきたなと。動画像を処理するにはGPUは結構適していると思います。
フレドリック:エンターテインメントやビジネスに限定すると、どうなんでしょう?
橋本:どういった技術が活用できるかというところによると思うのですが、エンターテインメント系でも最近、クリエイティブなコンテンツを作るAIが出てきています。キャラクターの自動生成では、例えば顔も、動きも、台詞も生成します。こういうものが出てきて、シンセサイズできるようなものが流行り始めれば、ここには非常に大きなマーケットがあるんじゃないかなと思います。
産業活用形だと、センサーが非常に高度化してきていますので、高解像度な画素センサーを使ってもっとデータを取得するには、僕はやはりGPUが便利かなと思います。スマートフォンでも4Kで撮れる時代になり、手軽に高解像度の画像が手に入るようになった。これは結局、その画像をコンピュータのインプットとして使えるようになったということですね。なおかつ、そのコストが非常に安いということです。
ですから、その画像センサーを使ったコンピューティングがこれからもっと増えていくんじゃないかなと思います。画像を使うのはどういうことかというと、人が見て何か気づく、把握できるような情報をコンピュータで手に入れやすくなってきたことだと思うんですね。
あとはどんな計算アプローチをするかですね。通常の画像認識でもいいですし、今流行りのディープラーニングでもいいですし。もしくは、人間にできないこともコンピュータにはできます。人間は可視光の範囲でしか見れませんが、コンピュータはそのセンサーで取ることができれば紫外だろうが赤外だろうが全部取り込めるので、人間が視認できるRGBだけではわからない情報もこれから取れますよね。
フレドリック:そういう意味では、画素センサーによるインプット情報を処理するという部分はシリコンスタジオが得意な分野なんですよ。弊社としてもそういった部分の案件が今後ますます増えてくるかもしれないですね。
橋本:シリコンスタジオさんはずっとゲーム業界で仕事をされていますが、実はゲーム業界っていうのはいろいろなことをやらなきゃいけない。みんなと同じことをすると、できあがったものもどこかで見たような何かになりやすいので、できれば誰も見たことない、使ったことのない技術を皆使いたがるんですね。
なので、シリコンスタジオさんに対する要求も高かったと思うんです。そういうのを乗り越えてこられたので、やっぱり潜在能力が高いのだなと。僕もゲーム業界にいる時はどんな技術が使えるのか、どんな流れなのか、というのを常にウォッチしていました。そんななかで長く仕事されてきているので、非常に豊富な経験をお持ちなのだと思います。
フレドリック:ありがとうございます。
――最後にお二人から一言ずつお願いします。まずは橋本さんから、CUDAに関して一言。
橋本:今後コンピューティングというのは、よりパフォーマンスが求められるようになっていくと思います。時代を振り返ってみても、コンピュータに求められるパフォーマンスが下がったことはありません。現在においては、シングルスレッド、プロセッサ1個の性能というのは頭打ちになってきています。すると次はもう並列に行くしかない。非並列でやらなきゃいけないものもありますが、並列化できるものもかなり多く、この並列化の問題を上手くオフロードして、GPUに振っていくっていうのがこれからのスタイルになっていくのではないかなと思います。
ですから、通常のCPU+GPU、というコンピューティングが一番現実的なアプローチなんじゃないかなと。今、ディープラーニングをきっかけにAIが盛り上がっていますが、実際それを業務で使おうとすると、どうしてもデータの入力部分、あとはその出てきたものの出力部分、ここでかなり膨大な計算処理が必要になります。こういった部分はCUDAで書いていくのが一番いいと思っています。
――ありがとうございます。続いてフレドリックさん、シリコンスタジオの今後の展開などについて一言お願いします。
フレドリック:私たちが得意としているのは、3DCG、イメージプロセッシング、シミュレーション、といったキーワードで、高速化やカスタマイズ、ソリューションの加速といった分野です。勿論これでなくてはいけないということではありませんので、まずはご相談いただければと思います。
それから、シリコンスタジオとは関係なく、CUDA全体で1つ面白いなと思っていることがあります。今までHPCはほんとに一部のスパコンを持っている人たちでしかできない世界だったのが、現在は数万円のビデオカード、数十万円のグラフィックボードで、それと同じことができるようになってきています。すごく裾野が広がってきているんですよね。自分たちの手元にあるパソコンでできないと思っていたことが、実はもう、すぐそこでできる世界が来ているんです。
そういう意味で、CUDAとそのGPUを使ったコンピューティングというのは、一部の専門家がやるものではなく、皆さんの周りにあるものになってきています。弊社としてもCUDAの市場を盛り上げていきたいと思っています。
――本日はありがとうございました。
最後に、読者プレゼントについてご案内します。今回は、CUDA Cプログラミングを実践するための技術解説書である「CUDA C プロフェッショナル プログラミング」を抽選で10名様にプレゼントします。
プレゼントをご希望の方は、下記注意事項とシリコンスタジオ 株式会社の「個人情報保護方針」に同意の上、「プレゼント応募フォーム」よりご応募ください。
【応募期間】
2018年1月23日(火) ~ 2月28日(水)
応募フォームはコチラ
※シリコンスタジオのサイトにリンクします。
【注意事項】
※応募はお一人様一回までになります。
※NVIDIAおよびシリコンスタジオ 社員、関係者は応募できません。
※厳正なる抽選の上、3月16日(金)までに当選者を決定し、発送を完了いたします。
※当選者の発表はプレゼントの発送をもってかえさせていただきます。
※不正なアカウントからの応募や、不正と見なす行為が発覚した場合、またはご当選者の住所、転居先の不明等の理由により賞品がお送りできない場合はご当選を取り消させていただく場合がございます。
※プレゼントの発送は日本国内に限らせていただきます。
※当選後のご本人様以外の方への権利譲渡はお受けできません。
※本キャンペーンの内容は、予告なく変更する場合があります。あらかじめご了承ください。