インテル® FPGA SDK for OpenCL™プロ・エディション: プログラミング・ガイド

ID 683846
日付 4/01/2019
Public
ドキュメント目次

12.4.2. カーネルコピーでのチャネル使用

カーネルを複製コピーした計算ユニットにチャネルを実装するには、チャネルの配列を作成し、get_compute_id() の戻り値を使用しその配列にインデックスを付けます。

次のコード例は、複数の計算ユニットにチャネルを実装しています。

#define N 4
channel int chain_channels[N+1];

__attribute__((max_global_work_dim(0)))
__kernel void reader(global int *data_in, int size) {
	for (int i = 0; i < size; ++i) {
		write_channel_intel(chain_channels[0], data_in[i]);
	}
}

__attribute__((max_global_work_dim(0)))
__attribute__((autorun))	
__attribute__((num_compute_units(N)))					
__kernel void plusOne() {
	int compute_id = get_compute_id(0);
	int input = read_channel_intel(chain_channels[compute_id]);
	write_channel_intel(chain_channels[compute_id+1], input + 1);
}

__attribute__((max_global_work_dim(0)))
__kernel void writer(global int *data_out, int size) {
	for (int i = 0; i < size; ++i) {
		data_out[i] = read_channel_intel(chain_channels[N]);;
	}
}
図 24. チャネルを実装するカーネルコピーのトポロジー例この図は、上記OpenCL™アプリケーション・コードが生成するカーネルグループのトポロジーを表しています。
注: このカーネルコピーの実装は、ソースコードに4つのカーネルを個別に定義し、chain_channels[N]へアクセスするためのインデックスをそれぞれハードコーディングすることと機能的に同等です。