waifu2x 高速化版更新

CUDA版も入れた。いちおう区切りついたので32bit版も置いておく。

http://int.main.jp/files/waifu2x-converter_x86_20150616_02.exe

http://int.main.jp/files/waifu2x-converter_x64_20150616_02.exe

手元のGTX765M だとまだcaffe版のほうが3%ぐらい速いので存在理由は無い。まあ自己満足だね…


OpenCLあるのに CUDA 版を作った理由は、

  • OpenCL では shared のサイズが変えられない。ローカルメモリサイズはかなり影響するので、cuCtxSetCacheConfig は必須といってもいい
  • なんか NVIDIA GPU だけ OpenCL 止まる理由をデバッグするのが面倒だったから

という二点。まあどうせ細かいチューニングしたら別になるだろうと思って、二つ作るのは抵抗無かった。
でも結局ふたつとも似たようなものになってしまったのでsharedサイズ以外は分けた意味無かったかな…



1920x1080 を入れたときの時間が、

時間 [sec] 性能[GFLOPS] 効率[%] 消費電力[W]
FMA版 i7-4700MQ @ Win8.1 38.23 161.29 52.5 39
CUDA版 GTX765M @ Win8.1 20.80 296.40 22.3 57
OpenCL版 A10-7850K @ Linux 21.16 291.41 39.7 53
FMA版 A10-7850K @ Linux 80.96 76.17 64.3 95
waifu2x-caffe GTX765M(参考) 20.21 301.7(多分) 22.8 66

時間は、waifu2x-caffeと同じ範囲をはかっているはず。初期化を含まない、pngの読み書きを含む。

消費電力はワットチェッカ目視でアイドル時との差分。まあ目安なのであんまり信用しないで。
ターボブースト有効なので、FMA版の効率は実際にはもうちょっと低い。
演算数は、ブロック分割で増えた分を含んでいる。つまり、真の理論値よりもFLOPSが増えている。(まあでもブロック分割のコストのほうがでかいのでブロック分割したほうがFLOPS上がるということは起こっていない)

  • CUDAある環境ではCUDA
  • AMD OpenCLある環境では OpenCL
  • FMA あればFMA
  • AVX あればAVX
  • どれもなければOpenCVのfilter2D

という優先順位で動く。CUDAが複数ある場合や、AMD OpenCL GPUが複数あるときの挙動はよくわからない(最初に見つかったのを使っている)

Intel GPU は見つかっても外している。というのは、FMA版のほうが速いのと、Intel GPUアセンブリ出力できなくて細かいチューニングできないのでどうしようもない。まあアセンブリ出せるようになったらやる気出てやるかも。


--disable-gpu を付けると、GPUを使わないようになる。

--block_size で処理ブロックサイズを指定。動作確認していないので0,512,1024以外は入れられない。0 を指定するとブロック分割しない。


さすがに時間使いすぎて生活と仕事に影響が出ているので高速化はこのへんでやめようと思う。もっとやって欲しい人は弊社のcontactまで連絡ください(まあ3人月くらいかな。単価は(ピー)万円)。もしくは雇って。

作業量はFMA版3〜4日、OpenCL版5〜6日、CUDA版3日ぐらい。OpenCL版はかなり試行錯誤してて、CUDA版はそれを使っただけなのでCUDAのほうが簡単というわけではない。

いちおうDLL化まではするからもうちょっと待って。




今後高速化にチャレンジする人のためにいくつか書いておくと、

この処理は、Multi-convolve と言って、Deep Neural Network の重要な処理らしい(というようなことが http://on-demand.gputechconf.com/gtc/2014/webinar/gtc-express-sharan-chetlur-cudnn-webinar.pdf に書かれている。僕はよくわからない)。

なので、気合いを入れて作る価値はあるのではないかと思う。あと適度に難しい問題なので、練習にもよいのではないかな。


まあでも世界最速を目指すのはかなり難しそう。


waifu2x オリジナルの作者のultraist さんの情報によると https://twitter.com/ultraistter/status/601603101628366848 cuDNNの実装は最速というわけではなくて、まだ速い実装があるみたい。

cuda-convnet2 は、なんか処理速度が画像サイズに比例しないようになっているらしくて、画像サイズがでかいと有利なのかなという気がする?

NervanaSystems の実装は、ptxas が効率悪いからと言って、自分でSASSを解析、より優れたmaxasを実装してcublasよりも速いsgemm(https://github.com/NervanaSystems/maxas/wiki/SGEMM )を作った人外の中の人外であるScott Grayさんが作ってるらしいので、おそらく効率90%オーバーとか出てるのではないかと思う。

なので、世界最速を目指すなら

  • アルゴリズム理解して計算オーダを減らす
  • その上で、GPU で効率90%オーバーを目指す(僕のように効率30%で満足する人間では勝てない)

とかする必要がありそう。

追記

http://int.main.jp/files/waifu2x-converter_x86_20150616_02.exe
http://int.main.jp/files/waifu2x-converter_x64_20150616_02.exe

ごめんミスってたので更新

  • OpenCL版動いてる理由がよくわからないミスをしてた。
  • 32bit版が64bit版だった
  • sm30用のptx出してると思ってたけどsm20用のを出してた

動作確認環境変えないとできないから面倒なんすよ。多分CUDA,OpenCL両方ちょっとはやくなってるはずだからゆるして