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

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

5.4.2. チャネルにおけるデータの動作

チャネルに書き込まれたデータは、カーネルプログラムがFPGAデバイスにロードされている限りチャネルに残ります。
つまり、チャネルに書き込まれたデータは、複数のワークグループやNDRangeの呼び出しにわたり持続します。ただし、FPGAデバイスの再プログラミングにつながる、カーネルプログラムの複数の呼び出しまたは異なる呼び出しにわたりデータが持続するわけではありません。

OpenCLの実装において、デバイスの再プログラミング動作を回避するよう最適化を実行した場合でも、チャネルのデータは、コンテキスト、プログラム、デバイス、カーネル、またはプラットフォームのリリース間では持続しません。例えば、同じ.aocxファイルを使用しホストプログラムを2回実行する場合や、ホストプログラムがコンテキストをリリースし再取得した場合、チャネルのデータは動作全体にわたって持続したりしなかったりする可能性があります。FPGAデバイスのリセット動作が、チャネルのデータを消去するオブジェクト・リリースの裏で発生する可能性があります。

次のコードを例に示します。

channel int c0;

__kernel void producer() {
    for (int i = 0; i < 10; i++) {
        write_channel_intel (c0, i);
    }
}

__kernel void consumer (__global uint * restrict dst) {
    for (int i = 0; i < 5; i++) {
        dst[i] = read_channel_intel(c0);
    }
}
図 7. チャネルデータFIFOの順序付け


カーネルのproducerは、10の要素 ([0, 9]) をチャネルに書き込みます。カーネルのコンシューマーには、ワークアイテムの識別子の問い合わせが含まれていません。よって、暗黙的なreqd_work_group_size属性 (1,1,1) を受け取ります。この暗黙的な属性reqd_work_group_size(1,1,1) は、単一のワークアイテム・カーネルとしてコンシューマーを起動させる必要があることを意味します。上記例においてconsumerは、1回の呼び出しに5つの要素をチャネルから読み取ります。最初の呼び出し中にカーネルのconsumerは、0から4の値をチャネルより読み取ります。データはNDRangeの呼び出し間で持続するため、2回目にカーネルconsumerを実行する際は、5から9の値が読み取られます。

この例の場合、デッドロックの発生を回避するため、カーネルproducerの呼び出しごとにカーネルconsumerを2回呼び出す必要があります。consumerの呼び出しが2回未満になると、チャネルの容量がフルになるためproducerがストールします。consumerの呼び出しが2回より多い場合は、チャネルに十分なデータがないためconsumerがストールします。