SSブログ

OpenCLでAppleとAMDのソースが、NVIDIAので動くかどうか [プログラミング]

基本的には動いて当然の物だろうと思っていたら、ちょっと違うようだった。

Appleにhello.cっていうソースがあって、それをUbuntu上のNVIDIAのOpenCLで動かそうと思ったら、うまくいかなかった。

 gcc hello.c -o hello -lOpenCL

で、問題なくコンパイルできたのですが、動作がきちんとしていない。エラーなどにはならないものの、実行の結果が誤って出てくる。やってる事はOpenCLのAPIを使う事以外はほとんどしていないので、正直何が悪いのかが見当がつかない。もしかしたら、他にコンパイルオプションが足りないのかなぁとも思っている。

 
ソース互換ぐらいとってよ、と思うのですが、縛りがOpenCLのAPIのみなので仕方ないのかもしれない。エラーが出ないっていうのが、逆に調べる状況を悪化させているのですが、現行で動いているソースと照らし合わせながら訂正していくしかないのかもしれません。

今感じているのは、kernelへの入力が上手くいってない感じがしています。

んむ、直接、printf()デバッグで値を見てみたけど、間違っていないみたいです。floatの値を比べているのだけれど、細かい値が違うとしか考えられないのです。%fで出ている値は同じなので、かなり不可解ですが。でも、きっちり入力されて計算はされているようで、結果のアプトプットがダメみたいな気がします。

hello.cはダメなので、OSXで動く他のソースをいじってみる。うぁ、元々OSXで使っていたコードがちょっと古いものらしい。ソースの見通しが良かったので、Fixstarsのサンプルコードを使っていたのですが、それってOpenCL 1.0のだったのかも。今は1.1だろうから、動作が上手くいかなくなっても仕方ないですね。

とりあえず、元に戻って、hello.cは上手くいっているという事にして、このソースを元にMacOSXで動かなかったソースを動かしてみようと思います。OSXで動かなかったソースというのは、元々AMDのソースでkernel部分のソースが、妙な挙動をしていているものでした。そのカーネル部分のソースが問題ないかどうか調べるために、UbuntuのNVIDIAな環境に持ってきたわけです。嗚呼、AppleのOpenCLがヘボなのを実証するためにどんだけ面倒な事をしているんだろう。ほとんど、AppleのOpenCLがどうかしているのは分かっているのですが、同じAPIでもどれだけ実装がダメか調べないと、あきらめるに諦められなかったりしています。


あ、上手くいった。Macで正常に動くhello.cを改造して、元々AMDから持ってきた、MacのOpenCLで動かなかったソースが、Ubuntu上のNVIDIAのOpenCL上で動きました。念の為、その改造ソースをMacOSXのOpenCLで実行したところ、動きませんでした。g++でのコンパイルは手を入れずに実行できたものの、やはりclBuildProgram()でエラーになって止まってしまうのは変わっていなくて、clGetProgramBuildInfo()でエラー表示をすると文字列が全くでないのは同じでした。


《結論》
 MacOSXのOpenCLは、kernelをコンパイル(インタプリター?)する時に、かなり問題がある。
 UbuntuリポジトリのCUDAでは、gcc hoge.c -o hoge -lOpenCLで、他にパラメータは必要ない。

という事でした。逐一やっているだけじゃないみたいだから、インタプリタじゃなくてGITあたりに近いのかな。まぁ、他のところは普通にAPIを実装すれば済むけど、kernelの文字列の部分は、コンパイルする時には何の問題もない事が多い(まぁ基本GCCだからな)ので、Appleの技術者ごときではOpenCLカーネルコンパイラの実装がまともに出来なかった、という事らしい。


言える事は、まともなOpenCL環境を求めるなら、MacOSX付属のものは、今は到底役不足であり、やりたいなら、グラフィックカードベンダが提供するものを使った方がまともに使える、という事である。やっぱAppleダメじゃん。OpenCLの言い出しっぺなんだからきちんとやっておくれよ。次に新しいOpenCLが使えるようになるのいつなのかな。今までからして、次も全然期待できないけどね。


タグ:GPGPU
nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。