OpenCLここまで整理

最近このサーバが死ぬほど重い。。。リクエストを送っても返ってくるまで5秒以上かかる。キャッシュ使って早くしようとしたけどうまく設定できなく断念。また時間のあるときに設定しようと思う。

さてさて、10月ももう終わろうとしており、卒論を本格的に書き始めなければならない。とりあえず、OpenCLについてここまで整理、

現段階の目標は、複数枚のGPUを動かすこと。いろいろ試行錯誤した結果、当初僕がイメージしていた実装ではできないっぽいことが判明。OpenCLは、まず最初にコンテキストを作成しなければならないが、そのコンテキストに複数のデバイス情報を入れることでそのコンテキスト情報をカーネルに送ってマルチデバイスで計算するものだと思っていた。ただ実際はそうではなく、コンテキストがベンダーごとに作ってあげなければいけないらしい。device_idはベンダーごとのデバイスリストであるが、そのデバイスリストをコンテキストを作成するために必要なpropertiesに含めることができないみたい。
普通はこう書く。
[cpp]
cl_context_properties properties_gpu[] = {CL_CONTEXT_PLATFORM, (cl_context_properties)id[1], 0};
[/cpp]
だけどぼくは
[cpp]
cl_context_properties properties_cpugpu[] = {CL_CONTEXT_PLATFORM, (cl_context_properties)id[0],(cl_context_properties)id[1], 0};[/cpp]
[cpp]
cl_context_properties properties_cpugpu[] = {CL_CONTEXT_PLATFORM, (cl_context_properties)id[0],CL_CONTEXT_PLATFORM, (cl_context_properties)id[1], 0};[/cpp]
こんな感じでpropertiesに複数のデバイスCPUとGPUを含めることができると思ったができないっぽい。残念。

じゃあどのようにすればよいか。おそらく、二つのプラットホームを作らなければならない。CPUとGPUの二つのプラットフォームを作り、そのプラットフォームにそれぞれ処理を割り振って、カーネルプログラムで処理させるという流れになるだろう。そのためにはカーネルプログラム事態を二つに分けなければいけないのかや、カーネルプログラムのなかに二つのプラットホームを含めることができるのかも検証しなければならない。

でもおそらく、カーネルプログラムを実行する段階でデバイスリストを渡しているため、複数のデバイスでに自動的に処理が割り振られているかもしれない。ここもまだ検証中。

ここの問題を解消できれば、あとはライブラリ開発したり、割り振るアルゴリズムを考えるだけなので比較的簡単にできそう。はやく解決して12月中には、卒論の第一稿を提出したい。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です