2014年5月23日金曜日

OpenCLによるGPGPU入門②

OpenCLによるGPGPU入門①で説明したソースコードを貼っておく。

以下のコードでは、ファイルの更新状況によって、
オンラインコンパイルとオフラインコンパイルを自動で選択するようにしてある。

その時、ファイルの最終更新日時を取得するのに、Windows依存のAPIを使用している。

また置いてあるプロジェクトはVC++で作成したので、
他のOS(Windows以外のOS)では
改行コードが異なるため注意して欲しい。

以下コードと作成したプロジェクトのダウンロード。

個人的なメモ。
エラーログの表示で、
コンパイラから帰ってきたデータの表示で一部バグってたかもしれないのは、
windowsとlinux系では改行コードが異なるのが原因?
つまり、windowsでも正し動作するように改行コードを書きかえる必要があるかも。
「\n」→「\r\n」と書き換えるって事。
……ところでまだバグってたかどうかは……まあ、今度やる機会があったら確認しようorz。



コード


以下の関数 では、FilePathに指定したファイルをmallocに確保したメモリ上に全てコピーします。
関数内でmallocによりメモリーを確保するため、使用後はfree()によるメモリの解放が必要です。
ReadDataに読み込んだデータの配列を返します。
また、fsizeに読み込んっだデータサイズを返します。




「オフラインコンパイル」する場合に、必要なデータを保存しておく。

たしか……
programを渡しておけば、
FilePathに指定したファイルに勝手に保存してくれる。
次回以降、コンパイルの必要が無ければ、FilePathに保存したファイルを読み込めば良い。
FilePathに指定したファイルが存在しない場合は、勝手に作るんだったか、自分で作る必要があるのかは……忘れた。





Kernel.clファイル(実際にGPU上で動作するプログラム)


//実行結果

当然ですが、プログラム中でオフセットを設定し、更に配列の最後まで計算させていないので、
計算していない場所は、初期化した時のまま0です。
計算結果の表示は、長くなるので、始めの50個と最後の50個だけです。

const size_t global_work_offset[]={30};

const size_t global_work_offset[]={0};
と書き換えると、オフセットが無くなります。
また、データ数1000に対して、
const size_t global_work_size[]  ={300};//タスクの総数
としているので、GPUは途中までしか計算していませんが、
const size_t global_work_size[]  ={1000};//タスクの総数
とすればGPUは最後まで計算してくれます。


Webで表示させる場合、どうしてもタブが上手く表示できないので、スペースキーに置換していたり、
色分けがされていなかったりと、
コードが見ずらいと思うので、一応プロジェクトを置いておきます。

ダウンロード先
MD5 | 372f9df2418c062753b2e06b0b4f5346 | 9.7 MB | OpenCL_Ver0.02_01
http://ux.getuploader.com/ADMIS/download/40/OpenCL_Ver0.02_01.zip


[2014_06_03]追記
他のプログラムに組み込み易いように、
もう少し処理を関数にまとめて、
main()関数を軽量化したバージョン。
(処理内容は同じ。)

MD5 | 7ad613859112e16ba7e37da1a9994d09 | 9.5 MB | OpenCLによるGPGPU
http://ux.getuploader.com/ADMIS/download/46/OpenCL_Ver0.02_02.zip

0 件のコメント:

コメントを投稿