OpenCL
現在、 GPU パイプラインが提示されるプロジェクトに取り組んでいます。のプロジェクトですAndroid OS
。
当分の間、特定の Qualcomm プロセッサに関して、パフォーマンスに問題が発生しています。通常、GPU パイプラインは で実行されます9-11 ms
が、実行時間が最大40-50 ms
.
私は考えられる 2 つの問題に対処する必要があると判断しました。メモリ アクセス (デフォルトでシステムによってバッファができるだけアンロードされないようにするため) とカーネル オーバーヘッドです。
その問題を解決するためにtask parallelism
、機能であるに目を向けましたOpenCL 2.0
。基本的に、GPU レベルで新しいカーネルを使用してキューをロードできるようになり、一連の作業をより厳密かつ効率的にするのに役立ちます。
それがどのように機能するかをテストするためだけに、非常に簡単な例を書きました。
__kernel void child_kernel(__global const int* buff) {
buff[get_global_id(0)] = get_global_id(1);
}
__kernel void parent_kernel(__global const int* buff) {
size_t offset[] = {1, 1};
size_t work_size[] = {100, 50};
ndrange_t testRange = ndrange_2D(offset, work_size);
void (^operation)(void) = ^{
child_kernel(buff);
};
enqueue_kernel(get_default_queue(),
CLK_ENQUEUE_FLAGS_WAIT_KERNEL,
testRange,
operation);
}
残念ながら、この単純な例は機能しません。私のbuff
にはまだゼロが含まれており、何も入っていません。だから私の質問は - 私はここで何か間違ったことをしていますか? タスクの並列処理は Android フォンでサポートされていますか? サポートされているかどうかを確認するにはどうすればよいですか?
どんな助けでも大歓迎です。ご清聴ありがとうございました!