OpenCLプログラミング#1
■ このスレッドは過去ログ倉庫に格納されています
さてついにOpenCLの仕様が公開されました。
http://www.khronos.org/opencl/
公式ページにはAPIのヘッダファイルが公開されており、
まだ実際に動かす事はできないもののプログラミングすることは可能となっています。
ということで、公開に先んじてプログラミングを始めてしまいましょう。 >>615
vetor extension記法でゴリゴリかく。
若しくは、-O3 -ftree-vectorize
但し、後者はまだまだ未熟なのは確かだね。 最近OpenCLを本格的に始めたんだが、
OpenCLのいいところは、コンパイラを選ばない、
カーネル以外はC++で書けるといところかな。
CUDAだと同じことができるけど、ホスト側でNVCC以外使おうとするとちょっと面倒だ。
ただ、カーネルの最適化がコンパイラでもできるから、
パフォーマンスは出やすいな。
LLVMで最適化レベルって設定ができるのかな? >>661
アーキテクチャが何にでも対応できるが、
アーキテクチャによって最適なWARP(に相当するもの)の数が違ったり、
コアレセンスアクセスできる条件が違ったり、キャッシュの有無だったりで
結局はアーキテクチャ依存の最適化をしないと速くならないよ。 Trinity APUで使ったらCPU使用率が50%(2コアなので1コアがフル稼働状態)になったが、こんなもんなの?
GPUで計算してるはずなんだが。 CUDA見たいに結果出るまでぽーりんぐしてんじゃないの? 自分のマシンのFLOPS計るのはどのベンチがお勧め? ちゃんとGPUで計算されてないだけじゃね
afterburnerかなんかでGPU側の使用率も見てる? Catalystのバージョン上げたらCPU使用率下がりました AMDのOpenCL SDKはCPU(SSE)デバイスもサポートしてるから
そっちで動いてたってことかな デバイス取得時にGPUを指定すればそんな目に合うはずね〜が デバイスにCPU使ってたらCPU使用率100%になるんじゃないの >>674
特に設定しないとシングルコアだからならない CPU版はdevice fissionしないと使えるコア全部使わなかったっけ? いくつか本読んで基礎的なことは
わかったんだけど、openclでmpegのエンコーダー
作ってみたいから何か参考になる情報ないかな CUDAでこれだからOpenCLはチューニング大変だな
pc.watch.impress.co.jp/img/pcw/docs/584/977/html/7b_prometech_32.jpg.html >>677
MPEGってどれよ?
MPEG4(H.264)のことならx264がSSE、AVXアセンブリ含むソースコードが読めるからオススメ 試しに↓使ってみたんだがローカルメモリ使ったら速度が3割落ちた。
www.aocplan.com/gpgpu/gpgpu-benchmark OpenCLってHyper-Qみたいな機能ってあるでしょうか? >>678
アーキ毎にカーネルを書きなおさないと性能でないよ。 標準のC++に替わり今後はOpenCLが標準に確定したな
OpenCLでパフォーマンスが激向上するから当然か >>684
ありがとう。VLIW4だとスレッド数1/4にして、1スレッドで4つずつ処理するようにしたら倍速になった。 R600のISA解説したpdfもどっかにあって、あれ読むとKernel Analyzerの右側の命令が読めるようになって捗るぞ。 CUDAが動かない古いNvidiaのビデオカードでも
OpenCLなら動いたりするものなのでしょうか? 確かnvidiaがOpenCLサポートしているのは、
チップがGeforce8以降かつ、ドライバの対応も必要だったと思う。
でもgeforce8以降はほとんどCUDA(とPhysXが)乗ってたはず。
それ以前はサポートされていないから動かないんじゃないかな(機材とドライバがないから検証できん) CUDAにせよ、OpenCLにせよ古いマシンでやろうとする奴はなんなんだ?
古いGPUじゃ大して効果がないし、アーキテクチャがどんどん変わって
いるから使えないものが多いのに。
最新のアーキテクチャでも1万円も出せばそれなりのものが買えるのになあ。 研究目的なら最新ので良いけど、実用だと4年前に導入した
数百台の計算機で高速化したい、とかもあるからな。 GeForce8以前って、どんだけ古いカード使っているんだよw
いろんな意味で、無理無理。 とりあえずGPGPU普及させたいならGPU各社ともミドルレンジ以下でFP64対応切るのやめてくんないかな
性能出るかどうかより使えたり使えなかったりってのが一番困る OpenCLのチューニングって、まずどのあたりから手を付ければいいかな?
ワークグループ分割数で結構変わるという話は聞くけど、やっぱり
おまかせより明示的に指定した方がいいんだろうか? おまかせとかやる気無さすぎだろう…
色々変えてみて速さを測れ。 ハードに合わせて適当な値を選んでくれると思ってたんで自分で下手な値を設定するより
いいかと思ってたんだけど、たしかに明示的に指定した方がよくなるケースが多いですね。
目安としてはCL_DEVICE_MAX_WORK_GROUP_SIZEに合わせておけばいいんだろうか?
それ以外、これは押さえておけ、というようなチューニングポイントってありますか? アドレスモードが便利そうなのでイメージオブジェクトを使ってみようと思ったんだけど、
これって4ch固定なんですかね?できれば1chで使いたいんだけど。 >>698
> 目安としてはCL_DEVICE_MAX_WORK_GROUP_SIZEに合わせておけばいいんだろうか?
これだとスピードでないよ。
Radeonだったら>>684の最適化マニュアルを、NVIDIAだったらCUDAの
説明書を読め。 つか、勉強目的でエミュレータみたいなのが欲しい
遅くていいから 最近のハードなら何でも出来るだろ。
新しいの買えよ。それぐらい自己投資だ。 ついに 2.0 で Dynamic Parallelism きちゃったじゃねぇか! nVidiaがいまだに1.1なのはどうにかならんのかな。 CUDAがあるから、あまり積極的にやりたくないんじゃね? 今AMDの環境で開発しているんだけど、NVIDIAの環境でもビルドできるよう
1.1の機能に限定することってできないんですかね?
CL_USE_DEPRECATED_OPENCL_1_1_APISみたいな。 OpenGLとの連携やっている人いますか?
OpenGLのHGLRCからcl_device_idを得るのにclGetGLContextInfoKHRというのが
ありますが、これを呼ぶ際、properties引数にCL_CONTEXT_PLATFORMを含めないと
エラー(CL_INVALID_PLATFORM)になります。
Platformを決め打ちで入れてやれば成功はしますが、cl_device_idを得る前にそれが
含まれるcl_platform_idを本来どうやって求めるのでしょうか? >>707
clCreateContext に渡した properties と同じもので GL context を1つに特定できるものを渡せって書いてあるだろうに
clGetGLContextInfoKHR で指定せずにエラーになるなら clCreateContext ではデフォルト値以外の cl_platform_id を指定したんだろう
gl_sharing が有効な CL context は作成済みなのになんで cl_platform_id だけ行方不明なんだよ
余所のライブラリが作った CL context に問い合わせたいなら clGetContextInfo で CL_CONTEXT_PROPERTIES 回答ありがとうございます。
ただ、clCreateContextはclGetGLContextInfoKHRでデバイスを得た後に呼ぶことに
なると思うのですが?
手順は以下で間違ってますかね?
GLコンテキスト(HGLRC)作成
→clGetGLContextInfoKHRで関連付けられているCLデバイスを取得
→clCreateContextでCLコンテキストを作成
いずれにしても、どのデバイスを使っているかがわからないとプラットフォームも
決まらないと思うのですが。 vloadn ってあるけど、直接ポインタを p[i] するのと速度違ったりするのか? vloadはアラインメントの制約がゆるい。要素でそろってればOK。
速度は実装によるだろうけど同じか制約がゆるいvloadのほうが少し遅い。 なるほど。
アラインメントの制約のせいで、ちょっと冗長になってたあのコードとかを小さく綺麗に書き直せるかも。
これは良いことを知った。サンクス。 JOCLも、早く OpenCL 2.0 に対応しろよ OpenCLって初期化とかやたら面倒なんですが、
OpenGL に対する glfw や GLUT みたいなライブラリはないんですか?
勉強してみたい(というか、勉強しかけた)のですが、
計算処理を楽しむ前に挫折しそうです。 あるけどない
独自API、英語のみのマニュアル…
初期化なんて一度書けば使い回しだからとりあえずやってみるべき マニュアルが英語なのは全く問題ないので紹介していただけないでしょうか。
それでも枝葉末節の部分が面倒であれば、今はそういうものだと諦め、
コピペで使い回してかんばります。
ただ、私はたとえば OpenGL 入門者に対して、同じ理由
つまり「初期化なんて一度書けば使い回しだから」という理由で
ウィンドウ作らせたり、レンダリングコンテキストを作らせたりはしたくないです。
使い回し
幸い OpenGL にはユーティリティライブラリがあり、入門者にはありがたいです。
なので OpenCL にも入門者用にきっと何かあるだろうと思っていました。 OpenGL ほど広く使われていたらあっただろうね。 NVIDIAやAMDのサンプルコードには簡単なユーティリティが入っているよ。
OpenGLみたいに糞面倒なわけじゃないから、わざわざGLUTみたいなものを
作ろうと思った人はいなかったんだろう。 c++binding使えば簡単じゃないか。
まあ、プラットフォーム選択する時点で
cudaには必要ない工程だが >>719
intelが最近OpenCLライブラリやGPU向けライブラリのプレビュー版を発表してる
ttp://software.intel.com/en-us/intel-ipp-preview
IPPはこれまで最適化済みCPUライブラリだったけど、それをGPUにも拡張しようとしてる模様 >>726
ありがとうございます。
調べてみます。 amd apu+linuxでaparapi経由で使ってみたんですが面白そうですね。
はるか昔に、javaで配列関係はどうしようかjniにでもしようかと悩んでたんですがこれでやっと悩みは解決できました。
java9.stream.parallelがopenclに対応してaparapiも不要になる(jvmと結合する)ようなので、openclを使えばjavaのままで配列のソリューションが得られるようです。
まだ触って4日ぐらいですが勉強がてらに、行列などの配列依存のライブラリを書き直してみようと思います。 >>717
software.intel.com/en-us/vcsource/tools/opencl-sdk/clu-api
CLUとか
github.com/Computing-Language-Utility/CLU/blob/master/simple/simple.c
このぐらいに書ける。
使ったことはないので便利かどうかは知らない。 Core iとグラボつんでグラボで画面表示しててもIntelHDでOpenCLの計算をさせることはできるのでしょうか あれ?遅くなる要因あるのでしょうか
使ってないIntelHDも使いたいというイメージだったのですが CPUスレッドとは排他でしか使えないと言うことですか? 732だけど、単純にIntelHDをグラボと取り違えただけだよ Ubuntu用のSDKはDebian GNU/Linuxで使えますか? >>733
俺も今日勉強始めたばっかだから実態よく分からんが、
規格ミニマムだとGPUで実行するバイナリを、
プログラム実行時に動的にコンパイルしてマウントする場合があるらしく、
それだとコンパイルのオーバーヘッドで遅くなりそう。
実行時にコンパイルせず事前にコンパイルしたバイナリを使うこともできるそうで
NVidia, AMDあたりはLLVMで動いてるからまず大丈夫だろうけど、HD Graphicsはどうなるんだろうか? CentOSにAMDのドライバを入れることに成功したけど、Debianには入らなかった。 質問スレってないかな?
Debian testing 64bit環境でbeignet 0.80をインストールしてclinfoしたら
GPU一個しか積んでないはずなのにPlatformが2個検出されるのですよ
これって正常なの? はい、haswell(i7-4771)を使っています。
その他のグラフィックボードは積んでいません Platformの数とデバイスの数はイコールじゃない。
デバイスはCPUとGPUの2個見つかるはず。ちなみに内蔵かどうかは関係ない。
気になるならclGetPlatformIDs/clGetPlatformInfoで見てみりゃいい。 はしょって書くと以下のように2回出力、Platform IDが一緒でプログラムなどでcl::Platform::getをすると
2個で返ってきます。(DeviceはALLで情報をとってもGPUしか返ってきません。CPUでDeviceをとろうとするとエラーが出ます)
Platform Name: Experiment Intel Gen OCL Driver
Platform ID: 0x7f6ee0ba1a40
Name: Intel(R) HD Graphics Haswell M
Vendor: Intel
Device OpenCL C version: OpenCL C 1.1 beignet 0.8.0
Driver version: 0.8.0
Profile: FULL_PROFILE
Version: OpenCL 1.1 beignet 0.8.0
Platform Name: Experiment Intel Gen OCL Driver
Platform ID: 0x7f6ee0ba1a40
Name: Intel(R) HD Graphics Haswell M
Vendor: Intel
Device OpenCL C version: OpenCL C 1.1 beignet 0.8.0
Driver version: 0.8.0
Profile: FULL_PROFILE
Version: OpenCL 1.1 beignet 0.8.0 Platform数はドライバの数
汎用のドライバとIntelチューンのドライバの2つが入っていたら2つのプラットフォームが出てくる
少なくともWindowsだとそんな感じ
あと745の結果でPlatformIDが同じなのはおかしい
多分745のプログラムはバグってる ドライバの数ですか・・・Debianのパッケージを入れる時にたしかに
汎用ローダとか言うのとintelドライバを入れた記憶があります
それで2つ出ているのか、入れたのは以下のパッケージだったような
opencl-headers - OpenCL (Open Computing Language) header files
beignet - Intel OpenCL library
beignet-dev - Intel OpenCL library
ocl-icd-dev - Development files to build a ICD Loader
ocl-icd-libopencl1 - Generic OpenCL ICD Loader
clinfo - Query OpenCL system information ■ このスレッドは過去ログ倉庫に格納されています