2015/07/01

Metalでwaifu2xを実装してみた

Mac OS X 10.11からMetalが利用できるようになるということなので、試しにコマンドラインツールとして、waifu2xをMetalで実装してみました。

まだいろいろ問題が山積みですが、とりあえず公開します。

なお、コンパイルにはXcode 7、OS X上でMetalを実行するには10.11 (El Capitan)が必要です。

コンパイル環境、動作確認した環境は次の通りです。

  • OS X 10.11 Beta2
  • Xcode 7.0 beta2 (7A121I)
  • MacBook Pro (Retina, Mid 2012)
  • NVIDIA GeForce GT 650M

参考にしたソースはwaifu2x.pyueshita/waifu2x-converter-glslですが、Metal版ではRGBモデルを利用しています。

Metalでの実装についての話は、第62回 Cocoa勉強会関西でする予定ですので、ここではMetal版の実装上の問題点を挙げておきます。

他のツールと比べて遅い

ueshita/waifu2x-converter-glslと比べると倍以上遅いです。

waifu2x-metal                   a.jpg  0.98s user 7.84s system 11% cpu 1:18.46 total
waifu2x-converter-glsl -m scale a.jpg  1.81s user 3.20s system 15% cpu   32.47 total

2倍拡大にしか対応していない

他ツールと比べて遅かったのもあって、コマンドライン処理あたりにはまじめに手を入れてません。 なので、ノイズ除去フィルタには対応していません。

分割処理していないので大きい画像は処理できない

オリジナルwaifu2xueshita/waifu2x-converter-glsl では入力画像を128x128ピクセルごとに分割して処理しているようですが、Metal版ではそれを行っていません。

そのため、処理できる画像サイズに制限があります。上限はGPUのメモリサイズによりますが、手元の環境 (GPUメモリサイズ 1GB) では元画像が800x600くらいが限界でした。

Intelで正常な結果が得られない

原因は調査中ですが、IntelのGPUを利用した場合には最終結果が上のようになってしまいます。

テクスチャなどのリソースの無駄使いが多い

Metal Programming GuideのTransient and Non-transient Objects in Metalでは、パフォーマンスのためにTextureは再利用すべき、とのことですが利用していません。

無駄な処理がある

頻繁にcommitして、さらにその直後にwaitUntilCompletedしているので、ここらへんを減らせば少し早くなりそうです。

関連リンク

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。