私はOpenCLカーネルから関数を呼び出すことができます。しかし、私の状況では、複雑な関数を並列化する必要があります(使用可能なすべてのスレッドで実行する必要があります)ので、その関数をカーネルにする必要がありますか?またはこの状況のための可能な解決策は何ですか?別のOpenCLカーネルからOpenCLカーネルを呼び出す
8
A
答えて
8
カーネルからヘルパー関数を呼び出すことができます。ヘルパー関数はカーネルと同じ方法で並列化され、カーネルコード内にインライン展開されていると想定します。したがって、各作業項目は、処理する作業セットのヘルパー関数を呼び出します。
float4 helper_function(float4 input)
{
return input.x + input.y + input.z + input.w;
}
__kernel kernel_function(const float4* arr, float4* out)
{
id = get_global_id(0);
out[id] = helper_function(arr[id]);
}
3
私があなたの質問を正しく理解していれば、カーネル内部からバッファを別々にフルパスしたいと思っています。私はそれがカーネル内では可能ではないと思うので、別のカーネルとして "内部"パスのコードを作成し、ホストコードとは別にカーネルを呼び出さなければなりません。そのカーネルからの出力は、ホストメモリに読み戻す必要はありませんが、カーネル呼び出しの間にデバイスメモリに残ることがあります。
2
OpenCL 2.0 specは動的パラレル化の新機能を追加しました。デバイス上のmy_func_B enqueus my_func_A以下の例で
6.13.17 Enqueuing Kernels
OpenCL 2.0 allows a kernel to independently enqueue to the same device, without host
interaction. ...
:カーネル自体から別のカーネルを呼び出すsramij回答に追加
kernel void
my_func_A(global int *a, global int *b, global int *c)
{
...
}
kernel void
my_func_B(global int *a, global int *b, global int *c)
{
ndrange_t ndrange;
// build ndrange information
...
// example – enqueue a kernel as a block
enqueue_kernel(get_default_queue(), ndrange, ^{my_func_A(a, b, c);});
...
}
関連する問題
- 1. のOpenCLカーネル+ ClMagmaアレイ
- 2. OpenCLカーネルの引数
- 3. OpenCLカーネルからの疎行列アクセス
- 4. このOpenCLカーネルがエラーの原因CL_INVALID_COMMAND_QUEUE
- 5. opencl用のカーネル関数のネスト
- 6. OpenCLカーネルに関する質問
- 7. 3バイトブロックで動作するOpenCLカーネル
- 8. 汎用データ型を持つOpenCLカーネル
- 9. カーネル側でネストループを書く方法OpenCL
- 10. 大規模なOpenCLカーネルの構造
- 11. OpenCLカーネル内でローカルアレイの動的作成
- 12. OpenCLカーネルからリスト(またはサブセット)を取得するには?
- 13. OpenCL実行モデル複数のキューに入れられたカーネル
- 14. ローカルメモリアレイをインスタンス化するOpenCL:カーネルのポインタエラーが無効です
- 15. カーネルOpenCLは結果を保存しませんか?
- 16. OpenCLカーネルにC++ベクタを渡してアクセスするには?
- 17. OpenCLカーネルで3次元配列を使用するには?
- 18. OpenCL - 異なるカーネル "printf()"が異なるデバイスに出力されますか?
- 19. OpenCL - カーネル内から別の関数を呼び出すことは可能ですか?私はここにあるチュートリアルと一緒に、次のい
- 20. OpenCL - 複数のカーネルにまたがるローカルメモリ
- 21. 呼び出す複数のカーネル、グローバルメモリパフォーマンス - CUDA
- 22. OpenCLカーネルの引数構造体に0の値があります
- 23. OpenCLカーネルは、より高速のGPUでより遅く実行する
- 24. OpenCLカーネルがGPU上で動作していることを知る方法は?
- 25. OpenCLカーネルが特定のパラメータで実行されない理由について
- 26. CUDAカーネルでホスト関数を呼び出す方法は?
- 27. OpenCLメソッドを呼び出すときのMonoでのsegfaultの調査linuxのclEnqueueTask
- 28. Mac OS 10.6でJavaCLのOpenCLカーネルを開発する実績のあるセットアップは何ですか?
- 29. Pythonでは、どのようにしてOpenCLカーネルにスカラー引数を渡すのですか?
- 30. 多くのメモリオブジェクトのOpenCLカーネルに通知する適切な方法はありますか?
は、ダイナミック並列処理と呼ばれています。このためには、OpenCL 2.0をサポートするデバイスが必要です。 http://stackoverflow.com/questions/12913640/opencl-dynamic-parallelism-gpu-spawned-threadsを参照できます – Meluha