http://toropippi.web.fc2.com/



HSPでGPGPUのためにまだまだ私は先へ進みます!
謳い文句は

「世界一簡単にOpenCLを扱えるプラグイン」

HSPからOpenCLを扱えるプラグインHSPCL32.dllの公開をしています。
頻繁にver upしていくと思うので管理はホームページのほうが簡単かなと思い開設しました。


今やGPGPUプログラミングはCUDAかOpenCL
CUDAにしろOpenCLにしろC++をまず勉強してからじゃないとなかなかすぐには扱えない
C++に至ってもまずVC++の使い方を学ばなければいけない

ディレクトリ設定から始まり、32bitアプリケーションにするか64bitアプリケーションにするか、コンソールアプリケーションにするかウィンドウアプリケーションにするか、マルチ バイト文字セットを使用するだのUnicodeだの、V100だのV90だのWindows7.1SDKだの、俺はただグラボで計算がしたいんじゃっていう人にとってはなんでこんな意味のないことに時間を割かなきゃいけなんだと・・・

だいたい親切な入門本にはそこらへんのことは懇切丁寧に解説してくれてますが、たいていそういうのって自分のパソコンの環境とどこか違ってて、そのせいで必ずどこかで躓く・・


だからGPUコンピューティングはウィザード級とか言われちゃうんですよ。



そんな現状をなんとかしようと開発されたのがこの「HSPCL32」です。
計算が早いだけでなく、環境を揃えるのも早いというわけですね。

とりあえずHSPをインストールして、このHPからHSPCL32をダウンロードしてきて、「HSPCL32.dll」と「hspcl32.as」を正しいところに入れさえすれば、
OpenCLですぐに計算ができる
そんなプラグインを公開することでGPUコンピューティングの敷居を少しでも低くできればなと思っているわけです。

肝心の計算速度ですが、具体的にはHSPの標準命令の処理より100倍以上早くなります!(もちろんグラボの性能によります)
試しに420万個のランダムな数の、奇数と偶数の数を数えるという処理をさせてみたところ、HSP標準命令(CPU1コア)で553ms掛かったところをHSPCL32では3ms(GPU全コア)で数え終わったということからも、OpenCLもといGPGPUの早さが伺えるかと思います。

これを実行した私の環境でさえcore i7 3820 と HD7750 なので、ハイエンドのグラボを2枚刺しとかにすれば2000倍くらい高速化できることも夢じゃありません!もちろんもっと高度な計算でね。



あ、あとHSPでOpenCLを扱うのに、なによりも簡単にしようと思っていたので、最短2命令でOpenCLの計算を実行できるような命令も用意しています!
以下にHello Worldのサンプルソースを貼り付けます。


#include "hspcl32.as"
HCLini 1
sdim hsp_array,128

sosu={"

#pragma OPENCL EXTENSION cl_khr_byte_addressable_store : enable

__kernel void hello(__global char* string)
{
   string[0] = 'H';
   string[1] = 'e';
   string[2] = 'l';
   string[3] = 'l';
   string[4] = 'o';
   string[5] = ',';
   string[6] = ' ';
   string[7] = 'W';
   string[8] = 'o';
   string[9] = 'r';
   string[10] = 'l';
   string[11] = 'd';
   string[12] = '!';
}


"}


HCLCall sosu,1,hsp_array,NULL,NULL,NULL,NULL,NULL,NULL
//hsp_arrayにHelloWorld入力カーネル実行

mes hsp_array






いろいろごちゃごちゃ書いてありますが、ここで使ってるプラグイン命令は「HCLini」と「HCLCall」だけ。
あとはカーネルソースがちょっと特殊なだけです。
#pragma OPENCL EXTENSION cl_khr_byte_addressable_store : enable
はカーネルつまりOpenCLで文字列が使えるようになるおまじない。

__kernel void hello(__global char* string)
は__kernel void までお約束、helloは関数名で__globalは引数の場所がVRAMであることを指す、charは文字列型宣言で* stringは引数名(ポインタ)

関数内は配列変数stringの各要素に文字を代入しているだけ。

関数内の処理の記述方法だいたいCやC++に似ていて、もちろんC++とかを扱ったことがなくても、サンプルを見ていればなんとなく分かる程度の四則演算メモリ管理なので、C++自体を最初から習うよりよっぽど慣れるのは早いかと思います。




無題4

無題3






他にも2013年コンテストverのHSPCL32よりも大幅に進化した2014年版のHSPCL32の見どころとして、OpenGL機能があります。
OpenCLで計算した座標を元に描画したいといった時に必要なのがOpenGLで、その機能を取り入れまくったのが今年のHSPCL32なんです。



無題2
無題
3567347
190731



なんかOpenGLって機能を追加してもしきれないほど奥が深いんですよね。これ以上頑張るとただの3DプラグインになってしまうのでOpenGLの追求はこのくらいにしておきたいと思います。
もう少し拡張すればかなり高機能な3Dゲーム用プラグインになりそうなんですがね。
私の本業はそこではないので。OpenGL関連は誰かやってくれそうな人に拡張してもらおうかと思います。



もちろんこのプラグインは「OpenCL」入門に使って欲しいですし、慣れてくればC++やPyOpenCLに移行してもらってもっとバリバリ組んでいけばいいと思います。
HSPユーザーには今まで計算が遅くてできなかったあんなことやこんなことをこのプラグインで実現していただけたらなと思っています。


で、私の当面の目標は、3Dで流体をシミュレート(cip法を使って高精度に)して炎を吐いて街を破壊するバカゲーを作るといったところですかね。長年の夢なので