私は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カーネルの引数
- 2. のOpenCLカーネル+ ClMagmaアレイ
- 3. OpenCLカーネル構築エラー
- 4. OpenCLカーネルからの疎行列アクセス
- 5. OpenCLのget_local_idまたはカーネル
- 6. OpenCL無効なカーネル名
- 7. OpenCLカーネルの__のポイントは何ですか?
- 8. Intel Openclのカーネルにクラスを渡す
- 9. OpenCLの:どのように[OK]をカーネル
- 10. OpenCLカーネルにstd :: stringを渡します。
- 11. OpenCLカーネル引数の情報を取得
- 12. opencl用のカーネル関数のネスト
- 13. OpenCLカーネルのベクトルベクタの宣言と定義
- 14. このOpenCLカーネルがエラーの原因CL_INVALID_COMMAND_QUEUE
- 15. 3バイトブロックで動作するOpenCLカーネル
- 16. OpenCLカーネルに関する質問
- 17. 汎用データ型を持つOpenCLカーネル
- 18. カーネル側でネストループを書く方法OpenCL
- 19. OpenCLカーネル内でローカルアレイの動的作成
- 20. 大規模なOpenCLカーネルの構造
- 21. Iは、カーネル関数を定義する次のOpenCLコードを有するOpenCLのカーネル
- 22. OpenCL用のユーティリティツールキットはありますか?シンプルなOpenCLのカーネルを書く
- 23. OpenCLカーネルからリスト(またはサブセット)を取得するには?
- 24. OpenClカーネルのインデックスをオフセットする方法はありますか?
- 25. OpenCL実行モデル複数のキューに入れられたカーネル
- 26. openclカーネル内でarrayFire fft関数を呼び出すことはできますか?
- 27. プリプロセッサディレクティブはOpenCLカーネルのパフォーマンスに影響しますか?
- 28. 通常のポインタ演算はopenclカーネルで機能しますか?
- 29. ローカルメモリアレイをインスタンス化するOpenCL:カーネルのポインタエラーが無効です
- 30. OpenCLカーネルのvectorの値を渡します。
は、ダイナミック並列処理と呼ばれています。このためには、OpenCL 2.0をサポートするデバイスが必要です。 http://stackoverflow.com/questions/12913640/opencl-dynamic-parallelism-gpu-spawned-threadsを参照できます – Meluha