syghの新フラグメント置き場

プログラミングTipsやコード断片の保管場所です。お絵描きもときどき載せます。

GPGPU戦争の歴史を紐解く ―勃発から現在に至るまで―

GDC 2015でついにOpenCL 2.1が発表されました。SPIR-V中間表現(中間言語バイトコード)でプログラミング基盤をVulkan API (OpenGL Next Generation, glNext) と共有することができるそうです。これでカーネルをオフラインコンパイルできるようになります。OpenCL 1.2/2.0にはもともとSPIR 1.2/2.0という中間言語がすでに存在していたのですが、コア機能ではなく拡張機能扱いで、ベンダーごとに対応がまちまちでした。SPIR-Vは晴れてOpenCLのコア機能となります。個人的にはカーネル記述言語にC++14ベースが導入されることになったのが嬉しいですね*1。テンプレートやラムダ式が使えます(特にテンプレートは渇望していた機能)。というかこれまでのC99/C11ベースのOpenCL-Cはあまりにプログラマビリティが低すぎました。CUDAはもちろんHLSLにも後れを取る始末で、正直GLSLと大差ありません。OpenCLカーネルにおけるC++採用は、C言語がすでにアプリケーション記述の主力言語としては時代遅れとなっていることを象徴しているのではないでしょうか。

そのついでといってはなんですが、今日はGPGPUの発展・普及の歴史の中でも最大の功労者達と思われるAMD (ATI) とNVIDIAの戦いのうち、まずはDirectX 10出現の前後からDirectX 11 (DirectCompute) 出現までの時間軸におけるデファクトスタンダードの存亡をかけた攻防戦を見ていくことにします。

DirectX 10世代から11世代に至るまでのお話

2015年現在、GPGPU基盤技術として知名度が高いのは圧倒的にNVIDIA CUDAのほうで、AMD StreamとかAMD APP (AMD Accelerated Parallel Processing) とか何それ食えるの?という有様です。後から出てきたDirectComputeにすら負けています。

しかし実はATI (AMD) のほうがNVIDIAよりもGPGPU対応製品の投入時期が先だったとか倍精度対応が先だったとかいう情報があります。
前々から真偽のほどが気になっていたので、その裏付けをやってみることにします*2

GPGPU対応製品の投入

ATIRadeon X1900(Direct3D 9世代、統合型シェーダーアーキテクチャではない)上でのGPGPU基盤技術として2006年10月に「Stream Computing」を実現・実用化しているので、確かにNVIDIA CUDA(2006年11月発表、2007年7月リリース、統合型シェーダーアーキテクチャ必須)よりも先になる。
ATI Stream Computingの発表は、奇しくも統合型シェーダーアーキテクチャを初めて採用したXbox 360Xenos供給開始後。

ちなみにAMDによるATI買収は2006年10月に完了。買収騒ぎでドタバタしている中、技術者達は普段通り頑張っていたらしい。

しかしAMD FireStream 9170よりも前のストリームプロセッシング(GPGPU)向け製品(第1世代)が見つからない。英語版Wikipediaの情報が確かならば、ATIの初代GPGPU向け製品はRadeon X1900ベースのFireStream 2U (R580) とかいうヤツらしい?
(ちなみに日本語版のWikipediaはほぼ英語版のコピーで、たいした情報はない)

しかし「FireStream 2U」で検索しても、いつリリースされたのかまったく不明。オークションや中古品の取引情報以外はまともな情報がまったく引っかからない。

実は初代FireStreamは「AMD Stream Processor」という名称だったらしい。2006年11月発表。この子を誰か覚えていますか……

一方、G80ベースの初代NVIDIA Tesla C870は2007年6月発表。確かにGPGPU向けデバイスを発表したのはAMDのほうが先(Direct3D 10とCUDAに初めて対応したGeForce 8800は2006年11月発表だが、GPGPU向け製品ではない)。

倍精度対応

ゲームのようなリアルタイム3Dグラフィックスでは倍精度浮動小数点数が必要な場面はほとんどなく、特にGPUが担当する画面表示に関しては単精度浮動小数点ですべてまかなえる(CADに関しては話は別だが、内部演算精度と画面表示精度はまた別物)。
一方、科学技術計算においては、倍精度対応は必須であり、倍精度対応の出来が汎用計算に使えるかどうかの分かれ目になる。

調べてみたところ、倍精度対応も確かにNVIDIA Tesla C1060(2008年7月発表)よりAMD FireStream 9170(2007年11月発表)が先らしい。

しかもTesla C1060は単精度に比べて倍精度演算がすさまじく遅かった。それもそのはず、倍精度演算ユニットはSM (streaming multiprocessor: 複数のCUDAコアを束ねるユニット) に対して1個だけであり、まともに積んでいない。
NVIDIAが本気で倍精度対応するのはFermi世代から*3。ただしハーフレートの倍精度を実装したのは後にも先にもFermiのみで、その後にリリースされたKepler、Maxwellでは倍精度のハードウェアサポートが削られている。

余談:その名はCUDA ―APIの使いやすさと普及性―

下記は古い記事だが、医療分野でCUDAを利用したアプリケーション開発者へのインタビュー(特にPS3のCellやAMD/ATIのClose To Metalとのプログラマビリティ比較に関する所見)が興味深い。
結局のところ、最後はソフトウェアの組みやすい環境へとアプリケーション開発者は流れるもの。
いくら良いハードウェアを作っていても、ソフトウェア開発技術の発展と普及推進、およびそのための基盤整備を怠ったことがATI/AMDの敗因だったといえる。

AMDGPGPUテクノロジーAPI)は、Close To MetalやATI Stream/AMD Stream、CALやBrook+言語というわけのわからない(というか総じて馴染みの薄い)キーワードばかりが羅列され、ニューカマーには実態や構造がいまいちよく分からず、さらに現在はAMD APPとしてひとくくりに包括されてしまっている始末。
たぶんAMDの広報担当ですら、すべて正確に把握できている人間はいないのではないかと。
このあたりのブランド戦略の一貫性のなさも、GPGPU/HPCにおけるAMD劣勢の一因だと思われる。とにかくAMDGPGPUはふらふらしていて足元がおぼつかない。

NVIDIAがCUDAやTeslaという用語やブランドを継続して使用しているのとは対照的。CUDAのネームバリューはすさまじく、今はとりあえず「CUDA!!」と言っておけば大抵なんでも通じる。技術的知識がない人も「CUDA!!」でだませる。あと固有名詞なので、Web検索性が高く、狙った情報が手に入りやすい*4

そしてOpenCL

実際にはもっと熱くて濃ゆい、漢(オトコ)の戦いが繰り広げられていたと思うんですが、今回のツッコミというか検証はここまでにします。

現在のAMDはとりあえず独自API路線はやめてOpenCL推進に落ち着き、開発ツールの整備(CodeXL)や2.0規格のサポートも進めている模様(しかし肝心の対応SDKは2015年3月時点でいまだにベータ)。

今後のAMDOpenCLと命運をともにすることになると思われます。
上位レベルAPI(言語拡張)であるC++ AMPに関しても、Microsoftと協力してLinux移植を進めるなど、わりと意欲的です(OpenACCを開発したPGIを買収したNVIDIAに対する牽制の意味もあるのかもしれません)。
ちなみにJavaコンパイラをHSA環境向けの中間言語HSAILに対応させて、JavaGPGPUプログラミングできるようにする計画もあるそうです。C++ AMP相当の拡張をJavaに導入する感じになるんじゃないでしょうか。

あとFireStreamは2015年現在、FireProブランドに統一されていて、FirePro Sシリーズとなっています。名前変えすぎです。どおりでFireStreamで検索してもPCI-e 2.0世代の旧製品しか引っかからないわけだ……*5

結論としては、

  • ATI (AMD) が実はGPGPUの先駆者だったという伝説はデマではなく確からしい。
  • 現在のAMD環境向けGPGPUアプリケーション開発者はとりあえずOpenCL、DirectComputeもしくはC++ AMPを使っとけ(AMD独自技術はNG)。
  • ローレベル技術(ハードウェア層)には手を出すな。十分な開発情報が得られないだけでなく、すぐに廃れて過去の遺物になるだけ。もしどうしても使う気ならばそれを覚悟するべし。

なおローレベルAPIといえばMantleですが、Vulkan APIの要素技術として取り込まれることになったとはいえ、単独のMantleの今後はどうも怪しい感じです。

※2018-05-19追記:
AMD APP SDKは2015年8月にWindows版のv3.0が、2016年3月にLinux版のv3.0が正式リリースされたんですが、2018年5月現在、当のSDKを配布していたページが消失してしまっているようです。CodeXLのページも消失しています。確か3月頃まではアクセスできていたはずですが、4月に問題が報告されているにもかかわらず、ずっと放置されています。

ちなみにひっそりとGitHubにコードベースがあるようです。

オープンソース戦略(だけ)は評価しますが、リダイレクトも作らないで404 Not Foundのまま放置なんて、相変わらず仕事が雑なうえに呑気ですね。
AMDはその後ROCmとかHCCとかCUDAモドキのHIPとか始めちゃってますが、CUDAに追随するということはAMD自ら敗北を認めて軍門に下ったということに他なりません。また、残念ながらHIPはCUDAと完全互換ではなく、あくまで類似APIトランスレーターのレベルでしかありません。こんな煩雑でニッチな開発環境、いったい誰が使いたがるんでしょうか。OpenCLを直に叩いたほうがよっぽど楽で、移植性や将来性の点でもマシだと思います。

*1:その後、OpenCL 2.1の正式仕様が発表され、結局C++14の採用は先送りになりました。OpenCL 2.2では晴れてC++14が導入されましたが、2018年2月時点でベンダー実装は遅々として進んでいません。

*2:ちなみに自分がGPGPUに取り組み始めたのは、DirectX 11対応のNVIDIA製品すなわちFermiがリリースされた後だったりします。なので「GPUでもHPC向けだったら倍精度対応とか当たり前じゃん」って感じですね。むしろ倍精度に対応してない時代があったことのほうが信じられない。

*3:FermiのTeslaといえばGTC会場においてでっち上げられたモック(ハリボテ)が有名。

*4:AMDのほうは、BrookはまだしもClose To MetalとかStreamとか一般名詞や形容詞の組み合わせだったりするのでWeb検索性が異様に悪いです。AMDという社名自体もWeb検索性が悪く、Google検索では「AMD」で検索すると「and」もついでにハイライトされるのでノイズが増えます。

*5:グラフィックスカード製品はあっという間に時代遅れの骨董品になります。その速度たるやCPUのそれを凌ぐレベルで、それだけ技術の進歩・進化が激しい分野だと言えます。