2011年12月5日月曜日

Marsの移植が終わらない

Mars自体の処理の流れは掴めており、後はOpenCLとCUDAで差異がある部分だけを書き直せばいいのだが、
どのようなやり方で書き直すのが最適な手法なのか判断が付かず、そのたびに作業が迷走してしまう。

OpenCLではコンテキストやキュー、カーネルなどのオブジェクトを明示的に作成し、
メモリの転送やカーネルの実行時にそれらを指定してやる必要がある。

CUDAではこうした要素がプログラム実行時に暗に設定されるため、
ユーザはこれらを意識することなくプログラムを書いて実行することができる。

現在のMarsの実装だと、OpenCLではこうしたオブジェクトを利用する場面が
ソース内で関数を跨いで不規則に離散して存在しており、移植が非常に大変になっている。
特に関数呼出部分が辛く、OpenCLではカーネル関数ごとにクラスやオブジェクトを作って保持する必要があるため、
Marsで使われる多くのカーネル関数をどうにかしなければならない。

今までは何とかグローバル変数を使わずに済ませる方法を考えていたが、
このままではどうしようもなさそうなのでグローバル変数でオブジェクトを宣言するしかないのだろうか。

C++を使いだしてOpenCL関連のコードはかなり綺麗になったのだが、
またごちゃごちゃしてきそうで憂鬱だ。

0 件のコメント:

コメントを投稿