一応卒論の提出日が12月15日に決まった。それまでにある程度卒論を完成させなければならない。毎日2ページくらいのペースで書かないと間に合わない。。。
まだ全部実験も終わってない状態で書き始めてる。
これからすること。(ここから思考垂れ流し)
APIまで完成しているので、あとは最適化するだけ。ただこれが一番のメイン。どんな用途向けに最適化するか。
あくまでもだれでも簡単に使えるOpenCLが目的。ちょっと前にクロノスから発表されたCLUの考え方にに非常に近くなってしまうがしょうがない。
プロトタイプ向けに手軽にOpenCLを使えるためライブラリ開発、そして最適化は実行時間予測するために行う。これによってCPUとGPUのリソースどちらをどれだけ使ったほうがそのプログラムは高速化するかの予測ができることは実用性にもつながるはず、、、
今からやらなければならないことを整理すると、どんなプログラムも使えるような汎用的な最適化プログラムを組む。具体的には、CPUとGPUのプロセッサの特徴をブラシュアップして、この処理はCPUに、この処理はGPUというように分ける。それを.clファイルに対して考えなければならない。
ん?.clファイルに対してどのようにプログラミングすれば良いんだ?
ホストプログラムの処理はもちろんCPUが行う。この処理をGPUに回すことはない。となると最適化を考えた場合やはり.clファイルに対してリソース分配を考えなければならない。またマルチGPUについても考えなければならない。CPUとGPUの特徴の違いをまだ全部解析できていないが、例えば、CPUにはif文の処理、GPUにはfor文の処理というようにソースを読み込んだ段階でプログラムオブジェクトを分ける。そんなことをが果たして出来るのか?これは利用者がヘテロジニアスな環境を使う前提での研究だが、とりあえず家中に転がっていたCPUやらGPUを一つのパソコンに突っ込んでヘテロジニアスな環境ができたみたいな状況で、このパソコンでプログラムを動かしたい!みたいな。そのとき、「ほら、ぼくの研究役立つでしょ?」みたいな感じ。
そんでまずぼくのプログラムがするべきことっていうのは、まず環境情報をとってくる。どんなデバイスがあるのか。それがもし、CPUだけだったりしたら問題ない?いやそんなことない。OpenMPみたいにスレッドをたくさん立てて並列化するべきだ。またGPUが刺さっていたらもちろんCPUとGPUの並列化になるんだけど、一番難しいのはおそらくここのリソースの分け方。.clファイルを全部GPUに投げちゃえば楽なんだけどそれじゃ意味が無い。ここをさっき言ってたifとかforの関数ごとに分ける。本当にそんなんできんの?できて、CPUだけとGPUだけ処理してどっちが早いぐらいじゃねとも思う。もちろん変数なんて共有しているわけだからそれを別々のデバイスで計算したらわけわからんことになる気がする。そう考えると.clファイルの処理を分けるなんて無理じゃね?てか意味なくね?うーん。。。そんな複雑なプログラムなんてサンプルを考えるだけでも大変な気がする。んー例えばゲーム開発を想定して、分岐をCPU、グラフィック処理をGPUに振り分けるように、、、いやそれだったらホストプログラムの方で処理すればよいだけだ。そもそもCPUだけだったら.clファイルを作成する意味ってなくね?ホストプログラムで処理すればいいんだもん。。。先輩のCUDAでのやつもホストプログラムで処理させるようにしてるんだっけか????そうすると、ソースプログラムを読み込んだ段階でCPUとGPUで処理させてやって早く終わった方だけ結果返して表示させればいいんじゃね?でもそれってリソース分配になってない。。。
.clファイルが一つだけだと思っているからダメなのかもしれない。複数の.clファイルがあったとしてその.clファイルごとに「この.clファイルはCPUで処理するべきだ!この.clファイルはGPUで処理するべきだ!」ってなれば十分研究の価値はあるはず。.clファイルがいくつもあるプログラムってあるよね?.clファイルって結局計算してホストプログラムに結果返すんだから、.clファイルは十分機能ごとにわける可能性はあるよね。。。
今人に聞いたら単純に並列化すれば良いって話になった。適材適所って言うことを考えるんじゃなくて、少しでも高速化すれば良い。GPUがしてる処理をほんの少しでもCPUが負担してあげればそれはちゃんとした研究になる。そのためには、入力データを単純に分割する。その割合は少し考えなければいけない。ん?でもその割合って計算量によって変わる?そこらへんも考えなくちゃいけない。最初は単純にデータ量をデバイス数で割って割り当てれば良いか。
とりあえず今やらなければならないこと。CPUとGPUの並列化をできるようにする。非同期コマンドキュー。タスク並列化かデータ並列どっちが良いか考え、データの割り方を考える。色々試してみて、簡単でもいいから早いアルゴリズムを構築する。以上。
ヾ(*`Д´*)ノ”