2017-07-29 10 views
2

私はOpenClを使用して自分のプロジェクトに取り組んでいます。私のアルゴリズムの性能を向上させるために、単一のカーネルをパイプライン化することは可能ですか?カーネルが多くのステップで構成されている場合、A、B、Cと言うことができます。Aが新しいデータを受け取り、Bに渡すとすぐに新しいデータを受け入れるようにします。それらの間にチャネルを作成できますが、詳細に。openclカーネルパイプラインの実現方法

.clファイルにA、B、C(3つのカーネル)を書き込むことはできますか? enqueueNDRangeをどのようにエンキューするのですか? FPGA HPC開発用にアルテラSDKを使用しています。おかげさまで

答えて

4

パイプラインは、チャネルに接続された複数のカーネルを使用することで実現できます。すべてのカーネルは、同時に実行すると、データが一方から他方へ転送されます、このようなパイプラインの

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

+0

"チャンネル":

チャンネルとカーネル属性(具体的には、セクション1.6.4のOpenCLチャンネル拡張のためのインテルFPGA SDKの実装)の詳細については、IntelのFPGA SDK OpenCLのためのプログラミング・ガイドをチェック

ベンダー固有のようだ。 「パイプ」はこれを行う方法ではありませんか? (私は言うよりも、あなたが明らかにFPGA OpenCLについてもっと知っている)。 – Dithermaster

+0

こんにちは、Andrewに返信いただきありがとうございます。ですから、別のカーネルを同時に動作させるには、clEnqueueTaskを使用してEnqueueNDRangeの代わりに自分のカーネルをエンキューする必要がありますか?また、私のすべてのカーネル用のカーネルとコマンドキューを作成しますか? –

+0

コンパイラは私の単一のカーネルを自動的にパイプライン化しますか?例えば。 for(round = 0; round

関連する問題