GPUのイメージを掴む
0. はじめに
本記事では普段使っているGPUImage2をよりよく知るためにGPUの挙動を少し掴められればいいなと思って書きました。
1. GPUImage2とは
GPUImage2とは
Swiftで書かれたGPUアクセレーションを使って画像や動画に対して処理を行うオープンソースフレームワーク
のことです。
また、GPUImage
の第二世代に当たります。これはiOS、macOS、およびswiftをサポートする環境下で使うことができます。
開発元はKhronosです。
1.1 Githubリポジトリ情報
以下がGithubリポジトリになります。
また、2018/09/06付のスター数、フォーク数などは以下の通りです。
- fork数: 413
- star数: 3860
- contributor: 17
1.2 ライセンス
GPUImage2
はBSD-3-clauseライセンスで公開されています。
せっかく数日前にOSSライセンスのエントリを書いたので見てみようと思います。
1.3 目的
GPUImageの目的は
- 動画や画像の機械学習用途
- リアルタイムな動画処理
をすることです。どちらも一般的には処理が重くCPUだけでは対応できないところがありますが、GPUを使うことによって何百倍を高速化することができ、特にモバイルアプリでは注目に値できるでしょう。
1.4 必要条件
以下の条件が必要です。
- Swift 3
- MacかiOS上でXcode 8.0
- iOS 8.0以上
- OSX 10.9 以上
- Linux: Swiftコードやコンパイルできる環境なら大丈夫
1.5 GPUImageに使われているOpen GLの基礎
1.5.1 Open GLとは
OpenGL
とはコンピュータークラフィック用のAPIである。これによって開発者は直接GPU操作をしなくても簡単にGPUを用いた画像処理などが行えます。
いろんな2次元、3次元グラフィックをサポートしていて、ウェブでは広く知られているWebGLのパイオニアです。
詳細を知りたい人は以下のサイトをご覧ください。
1.5.2 Open GL(ES)とは
ESは組み込みシステム(Embedded System)の略で、Open GLに組み込まれているものです。
Open GL(ES)
とは、主に携帯電話などの組み込みシステムで使用されている3次元コンピュータグラフィックス用APIです。
1.6 フレームワークのアーキテクチャ
すべての画像や動画は以下のように、三角で構成されるメッシュでできている。っといっても過言ではありません。
このような画像を処理するのは以下のようなプロセスパイプラインを使います。
An intro to modern OpenGL. Chapter 1: The Graphics Pipeline
以下に細かい用語をまとめておきます。
Vertex
頂点。
Vertex array
Vertexが格納されている配列。
Triangle Assenmbly
Vertexを結んでできる三角形。
Fragment Shadder
テキスチャだったり、照明の処理をかける。
Test and Blending
すでに書き込まれている後ろにあるfragmentを削除する。
Framebugffers
出力。
パイプラインの入力はカメラ、ファイルなどimageやvideoです。そして、いくつもの変換処理をするimageConsumerを経て、出力のスクリーン、画像ファイル、生データへ出力されます。
アトミックな変換処理を繰り返すことによって、好きな変換処理をすることができます。
GPUを使った変換処理はOpen GE(ES) 頂点シェダーとフラグメントシェダーを使います。
2. vs Vulkan
グラフィックハードウェアの低いレベルの制御を目的としていて、AppleのMetalを競合しています。
Vulkanとは、同じくKhorosが開発しているクラスプラットフォームなグラフィックスAPIである。
特に**Open GLへはハードウェア設計への乖離があり、Open GLやOpen GL(ES)はハードウェアを高度に抽象化されていて、利便性が高いものの性能要求の厳しいソフトウェアの開発に利用する場合はオーバーヘッドが大きかったのである。
特にOpen GL 4.6からはVulkanと互換性があるみたいです。
参考文献
カーネギーメロン大学のGPUに関する講義資料
カーネギーメロン大学はコンピュータサイエンスで世界トップレベルを誇る。
特にGPUImageについてフォーカスされているが、CUDAやOpenCLなども触れている。 特に大きな変化はないが、GPUImage2ではなくてGPUImageについて書かれていることに注意。
http://16623.courses.cs.cmu.edu/slides/Lecture_4.pdf
Open GLとVulkanについてのニュース