読者です 読者をやめる 読者になる 読者になる

空飛ぶ気まぐれ雑記帳

主に趣味とかプログラミングについて扱います。

GPGPUって色々あるけど結局どれがいいの

GPGPU C++ Computer Vision

はじめに

元ネタはこれ。本文の引用も特に注意書きがなければここから引用してます。
CUDAとOpenCLどっちがいいの? - Qiita

オチは変わらず、

そもそも単純に比べんな。ナイフとノコギリがどっちがいいかなんて一概には言えないだろう?

ただ、自分なりに色々調べたり使ってみて、それのまとめ。

CUDA

元ネタにかかれている通り、GPGPUっていうとCUDAが最強って説が多いし、実際使ってみるとめちゃくちゃ早い……らしい。
それに、オフラインコンパイルができるのがかなり素敵。
ただ、最新のCUDA8.0RC版ですら、Visual Studio 2015のUpdate 1までしか対応してないので、常に最新の環境を使いたい人や何も考えずにVisual Studioをアップデートしてきた人にとってはかなり辛い(2016年8月18日現在Update 3まで出ています)。
まあ、常に最新の環境を使いたい人はclang使えよって思うから一概には言い難いけど。

それはさておき、私は何も考えずにVisual Studioをアップデートしてきた勢なんでCUDAは全く使っておりません(他所の環境で遊ばせて貰ったことはありますが…)。

OpenCL

OpenなGPGPUというか並列化ライブラリ代表で、コンピュータビジョンやってる人的にはOpenCVのラッパーが結構便利で利用しやすいのが売りかな。
それと、GPUが載っていない環境でもOpenCLの場合、CPUでも同一のソースコードで並列化が実現できるので、その点結構便利かもしれない。
ただ、如何せん規格が微妙という説がある。
以下は個人的に使ってみた感想というか不満。

・オフラインコンパイルができないせいで実行時に毎回コンパイルする必要がある。
・元ネタにも書いているけどnVidiaのやる気の無さがパない。具体的にはGTX 970のドライババージョン350.81(だったかな)でOpenCL1.2のそれも半端にしか対応してない。これがどれ位酷いかと言うと、2005年頃にノートパソコン向けで一線級を誇っていたAthron X2 QL-60ですらOpenCL1.2に対応しているので、推して知るべし。
・元ネタを忘れたんだけど、初期の頃、中間言語がないため、実装をベンダーに丸投げしたせいで結構昔からあるくせにあまり浸透しなかったらしい。さらに、ベンダーによって実装レベルがマチマチ&nVidiaさん見たいなやる気無し勢が発生する原因にもなっているらしい。

OpenGL Compute Shader

Vertex ShaderやFragment Shaderは使ったことあるけど、これは使ったことない。でも、書き方は一緒なので多分使えるんだと思う。
ただ、OpenGLもShaderのオフラインコンパイルができないので実行時に毎回コンパイルする必要があるから、OpenCL使える人はわざわざこれ使う意味はないと思う。

DirectX Direct Compute

こいつもOpenGL Compute Shaderと一緒。ただ、こいつはオフラインコンパイルができるからOpenGL Computer Shaderよりも遥かにまし。

C++ AMP

もう最高。配列に突っ込んで計算するだけでハイ爆速っていうのが最高。
ただし、以下のとおり、Direct Computeが動いているのでDirectX 11の機能レベル11.0以上が必要。

Microsoftがやってるので当然Windowsで動きます(裏ではDirectComputeが動いているっぽいです)

さらに、倍精度演算を行うためにはWDDM1.4以上に対応している必要があったはず(うろ覚え)。

なお、私のメインの開発PCはDirectX 11対応のくせに機能レベル10.0とかいう謎仕様なので、使えません。

HIP

CUDAとほぼ同じ構文でポータブルな感じにしてくれるもの。 HIP自体はフロントエンドコンパイラみたいなもので、バックエンドにnvccを使えばCUDAに、先述のHCCを使えばGCN-ISAかHSAILになります。どちらも、オーバーヘッドはありません。もし更に最適化したかったら変換後のコードを見て最適化が可能です。

らしいのだけれども、Windowsに対する嫌がらせなのかWindows環境だとCMakeが通らない。
どうやら、CMake内でPerlスクリプトを使ってバージョン情報やらを取得してるんだけど、それの中でエラーが起きて上手くバージョン情報やらを取得できてないっぽい。
それに、私のコンパイル方法が悪いのかと思ってggってもHIPっていう名前のせいで尻についてしか出てこず、碌な情報がて手に入らないのがかなり辛い。

謳っていること自体はかなり私好みなだけに本当に辛い。

Etc...

使ったことも使う予定もないので知らん。
元ネタでも書かれているとおり調べても情報が出てこないか、微妙だなという話が非常に多い。

おわりに

私の開発PCはAMDなのでできたらHIPを使いたかったのだけれども、どうにも動かないので結局OpenCLを使い続けてます。
どなたか、HIPの情報まとめてくれないかなー