C++AMP


こんにちは、uimacです。

私は、去年レイトレ合宿2!! というイベントに参加して、レイトレーサーを提出し、
レイトレーシングすらしていない、ラスタライザを使った作品にボコボコにされましたボコボコにされました。

この記事はレイトレ合宿3!!!アドベントカレンダーの12回目の記事です。

私は前回ボコボコにされて再起不能なので今回は参加しませんが、何故かアドベントカレンダーの記事を書くことになったのでラスタライザを倒すために、書こうと思っていたのですが、すみません、ロサンゼルスに行くことになり、いろいろ切羽詰っていて、予定通り書けてません(ロサンゼルスです)



レイトレ合宿のレンダリングの制限時間は、年々減っていますが、世の中は、既に、動画の時代です。
私が3Dモデリングを始めて、人にモデルデータを見せるたびに言われ続けたのが
「アニメーションしないの?3Dって動かしてこそでしょ?」ということです。
レイトレ合宿の趣旨とは外れますが、動画を作ることを考えましょう。
3分間ステージの上でキャラクターが歌って踊る動画を作るとします。

30fpsとすると、180秒 x 30フレーム = 5400フレームです。
レンダリングに、1フレーム10分掛かかるとすると、54000分=900時間=37.5日です
1フレーム1分なら、3.75日です。
しかし、たとえばMikuMikuDanceで、ラスタライザで歌って踊る動画を作る場合、せいぜい5400フレーム1時間以内にできます。
これでは絵が綺麗であっても、ラスタライザを倒すことはできません!

また、レイトレーサーはobjなどのテキスト形式のファイルを毎回読み込んでレンダリングするものが多いかと思います。
30万ポリゴンくらいのシーンを1回読み込むのに30秒掛かってしまうと、レンダリングが速くてもロスが発生します。
AWSで100コアのCPUを使えるとしましょう。objファイルをシングルスレッドで読み込んでいる場合、30秒間1コアしか動きません。
お金がもったいないです!!!(人のレンダラをAWSで使ってこのような状況になった

さらに、前回のレイトレ合宿の上位から順番に試してみましたが、結構な数のレイトレーサーが
UVテクスチャに対応していないです。これはキャラクターが歌って踊る動画を作るに当たって、致命的です!


というわけで、ラスタライザを倒したい私としましては、以下がレイトレーサーに求める要件となります。
  • DiffuseColor、UVテクスチャに対応(必須)
  • 出来るだけノイズが少ない絵を1分以内(必須)
  • シーンデータの読み込みは出来るだけ早く(必須)
この条件で、出来れば1分と言わず30秒くらいで終わるレンダラが作れれば、
ライトユーザーでも使ってくれるようになるはずです。
ユーザーに使われるようになると、
動画の増加モチベーションの向上バグ報告(ある意味)自動テスト→修正、機能追加→動画の追加→・・(継続的インテグレーション)・・→ラスタライザに勝利 といった良い流れを作ることが出来ます!


さて、具体的に作戦を考えたところ、CUDAかOpenCLか、もしくはVulkanとかに辿り着くと思いますが、
僕はよく道を間違えるほうなので、C++AMPというのに辿り着きました。

CUDAはNvidia専用だし、OpenCLは命令が微妙だし、DirectComputeはDirectXだし、Texture+ShaderもGPUは必要です。
しかし、C++ AMP だと、1ソースで、DirectCompute/OpenCL/SSE (CPU!)で動くようです。
しかもVisualStudio 2013 に標準搭載されています!
何も「追加のインクルードパス」や「追加のライブラリ」に書く必要はありません。
DirectX11さえ入れておけば、勝手にVisual Studio 2013(以降)がリンクしてくれます!!



絵が出るサンプルとしては、とりあえず、これとか良いです。(VS2013+DirectXの環境ですぐビルドできました)

C++ AMP - Wikipedia

C++ AMPを使ってみよう - SlideShare

C++ AMP (C++ Accelerated Massive Parallelism)

首都大学東京 田川研究室 - C++ AMPを用いたGPUプログラミングwiki

C++ AMP sample projects for download



早速書いていきましょう!

と思ったけど時間切れです。

AOBenchを超早くしてやろうと思っていたのですが、すみません、
単にピクセルごとにGPUに送る程度で終わってしまいました・・・・。
オリジナルのaobenchのコードと比べると、ほんの少ししか変更してません。

が、ほんの少し変更して、GPUで実行されるだけで10倍早くなりました。
超しょぼいASUSのAtomで動いたので、ほとんどの環境で動くと思われます。

気になった方は、render という関数を見てください。 C++ AMP、すごく簡単です。



唯一はまったのは、よくできた乱数ライブラリや関数が存在しないことです。
aoampで使ってる乱数ライブラリは,512x512個くらい初期化しようとするとしにます。
xorshiftの並列対応版とかを作ってしのぐ必要があります。

以上中途半端で申し訳ないですが、ラスタライザに勝つまで引きこもって修行することにします。。。
レイトレ合宿3参加の皆さま、あと少しです、期待しております。
Good Luck!

Comments