で、結局OpenCLとは何か?

 それには、「“GPGPU”についてググりなさい。」というのが答えかもしれない。終わり。

 …。
 大雑把には、ベクトル演算ユニットの活用手段のひとつであり応用技術。そのライブラリ。
 名前からも推測できるが、OpenGLを踏襲した仕様体系。手続き的な部分が似ているので、OpenGLを使ったことがあれば、なんとなく使い方が見える感じ。

GPGPUって?

 知るには、まずここからかも。
 「GPGPU(General-purpose computing on graphics processing units; GPUによる汎用計算)とは、GPUの演算資源を画像処理以外の目的に応用する技術のことである」wikiより。
 要するに、最新グラボに搭載されている3DCG系の演算ユニットを汎用的な計算に活用する為の技術体系が、GPGPUと呼ばれている。
 用語的には、ベクトル演算ユニットとGPU(グラボに乗っている計算機)は別物で、コンピュータに直で乗っているのがベクトル演算ユニットで、GPUはそれとは別物。という扱いだけど、これは単純にグラボが専用のメモリを積んでいて、GPUはグラボに積んだメモリしか直接アクセスできない。というのが理由。コンピュータに乗ったメモリにはグラボからはアクセスできないので、グラボはコンピュータにデータを送って貰わないと何も計算できない。また計算結果もコンピュータに読み取って貰わないといけないので、ひと手間掛かる。
 その代わり、GPUはグラボ内のメモリに高速かつ(GPU搭載の複数の計算機による)大量のアクセスができるので、単純な計算を超高速に実行できる。
 単位時間当たりの計算速度はCPUを遥かに超えてきているので、そこに価値ができている。

 ただし、GPUにはいくつかの点でCPUに劣る面があり、計算可能な範囲がCPUに比べると制限を受ける傾向がある。

 長所:メモリにシーケンシャルにアクセスし、かつ条件分岐の無い計算(演算密度の高い処理)に強い。
 短所:条件分岐だらけ、メモリにランダムアクセスが発生する計算は大の苦手。

 また、GPUにより単精度浮動小数点しか対応していなかったり、メモリもCPUほど大きなサイズを持っていない点も短所に挙げられる。

で、結局OpenCLって?

 専用の記述式で計算処理(Kernel:カーネル)を書き、専用の初期化・実行処理で計算処理を実行させる為の環境がOpenCL。
 OpenCLドライバが用意されたGPUと対応するSDKを用意すれば、あとはプログラムを書くだけ。

 (参考)C++でOpenCL(使ってみよう編)

 CPUのような汎用的な処理は苦手だけど、計算処理を一気に処理することに特化した性能を持っているので、画像処理や3次元計算にはとても有用。

[OpenCL] 少し動かしてみたけど、結構情報が当て嵌まらない

 なんだろう? AMD環境って、今OpenCLのメインストリームじゃないのかな?
 検索して出てくる情報は、Intel系…というかMacの情報が多くて、そもそもうちの環境だとCPUがデバイスとして列挙されないんだけど…どゆこと??って感じになっている。

 とりあえず、下記のサイトとかでサンプル拝借しながらdeviceinfoを集めるところからやっているけど、自分で何とかしていかないと試しに人に倣って試してみる、という訳にはいかないかなぁ。

 ちなみに、参考のサンプルはWindowsで動かすと足りないものがあったりするので、処理を省くか、なんとか処理を補完しないと動かせなかった。。

参考

Dakkers/OpenCL-examples
tzutalin/clDeviceQuery.cpp
OpenCLに対応するデバイスの列挙(C言語・Mathematica)

その後

C++からOpenCLをラクに使うためにライブラリを書いてみた

 これも、うちの環境と違う。
 どうやらうちの環境だと、ユニファイドメモリをサポートしてないっぽい…(この方が言うには、「サポートしていないハードがないので動作未確認」とな。そんなに珍しい環境なのかしら?)

ClPyって??

 ClPy(シーエルパイ)なるものを見つけたので、メモ。

 「CuPyをOpenCLで動かすフレームワーク」なんだそうで…CUDA諦めてOpenCL勉強しようとしたら、これだもんなぁ、、
 とりあえず、忘れないようにメモっておく。

 CuPyをOpenCLで動かすフレームワーク ClPy を先行リリースしました

AMD APP SDKが見当たらない…

めも。

 CUDAが環境的にナニだったので、OpenCL調べてみるか…と思ったのだが、調べていくとAMD APP SDKが必要…みたいな話になってきたので、AMDでSDKをDLしなきゃーって思ったのだが、何故だか見当たらない始末。

 理由は不明だが、2018.12.2現在公開されている気配がない。

 で、こんな書き込みを見つけた。
 OpenCL SDK

 どうもここからもらってくる感じになってるみたい。
 AMDのドライバ(Radeonドライバとか)にはそもそもランタイムとしてOpenCLが含まれているらしく、とりあえずそこに置いてある include, libファイルでビルドすれば動くっぽい。

 参考サイト①にあるデバイス確認のコードで、実際に動くことも確認できた。

参考

C++でOpenCL(環境構築編)
SDKなしでOpenCLを使ってみる -導入編-
Khronos OpenCL Registry(仕様策定をしている団体のページ)
公式のリファレンス