パイプラインは、チャネルに接続された複数のカーネルを使用することで実現できます。すべてのカーネルは、同時に実行すると、データが一方から他方へ転送されます、このようなパイプラインの
Pipeline example from Intel FPGA OpenCL SDK Programming Guide
非常に基本的な例は次のようになります。
channel int foo_bar_channel;
channel float bar_baz_channel;
__kernel void foo(__global int* in) {
for (int i = 0; i < 1024; ++i) {
int value = in[i];
value = clamp(value, 0, 255); // do some work
write_channel_altera(foo_bar_channel, value); // send data to the next kernel
}
}
__kernel void bar() {
for (int i = 0; i < 1024; ++i) {
int value = read_channel_altera(foo_bar_channel); // take data from foo
float fvalue = (float) value;
write_channel_altera(bar_baz_channel, value); // send data to the next kernel
}
}
__kernel void baz(__global int* out) {
for (int i = 0; i < 1024; ++i) {n
float value = read_channel_altera(bar_baz_channel);
float s = sin(value);
out[i] = s; // write result in the end
}
}
あなたは、単一の.cl内のすべてのカーネルを書くことができますファイルを使用するか、別のファイルを使用して、それらをメインの.clファイルに#includeします。
すべてのカーネルを同時に実行して、互いにデータを受け入れることができます。だけで次のコマンドキューがサポートされているので、我々は各カーネルのために別のキューを使用する必要があります。NDRangeカーネルは、私たちにどんな恩恵を与えないように
cl_queue foo_queue = clCreateCommandQueue(...);
cl_queue bar_queue = clCreateCommandQueue(...);
cl_queue baz_queue = clCreateCommandQueue(...);
clEnqueueTask(foo_queue, foo_kernel);
clEnqueueTask(bar_queue, bar_kernel);
clEnqueueTask(baz_queue, baz_kernel);
clFinish(baz_queue); // last kernel in our pipeline
GPUのためのOpenCLプログラミングとは異なり、我々は、データパイプラインに依存しています。 NDRangeカーネルの代わりに単一のワークアイテムカーネルが使用されるため、clEnqueueTask関数を使用してエンキューします。追加のカーネル属性(reqd_work_group_size)を使用して、単一の作業項目カーネルをマークして、コンパイラに最適化の余地を与えることができます。
https://www.altera.com/en_US/pdfs/literature/hb/opencl-sdk/aocl_programming_guide.pdf
"チャンネル":
チャンネルとカーネル属性(具体的には、セクション1.6.4のOpenCLチャンネル拡張のためのインテルFPGA SDKの実装)の詳細については、IntelのFPGA SDK OpenCLのためのプログラミング・ガイドをチェック
ベンダー固有のようだ。 「パイプ」はこれを行う方法ではありませんか? (私は言うよりも、あなたが明らかにFPGA OpenCLについてもっと知っている)。 – Dithermasterこんにちは、Andrewに返信いただきありがとうございます。ですから、別のカーネルを同時に動作させるには、clEnqueueTaskを使用してEnqueueNDRangeの代わりに自分のカーネルをエンキューする必要がありますか?また、私のすべてのカーネル用のカーネルとコマンドキューを作成しますか? –
コンパイラは私の単一のカーネルを自動的にパイプライン化しますか?例えば。 for(round = 0; round