Intel® FPGA SDK for OpenCL™: ベスト・プラクティス・ガイド

ID 683521
日付 12/08/2017
Public
ドキュメント目次

3.3.1. 浮動小数点表現と固定小数点表現

FPGAには、浮動小数点演算を実装するための相当量のロジックが含まれています。ただし、可能であれば、データの固定小数点表現を使用して、使用可能なハードウェア・リソースの量を増やすことができます。 固定小数点演算を実装するために必要なハードウェアは、通常、同等の浮動小数点演算よりも小さくなります。その結果、固定小数点演算を浮動小数点演算よりもFPGAに適合させることができます。

OpenCL®標準は固定小数点表現をサポートしていません。整数データ型を使用して固定小数点表現を実装する必要があります。ハードウェア開発者は、通常、固定小数点データ表現を使用してハードウェアを節約し、計算を実行するために必要なデータ解決のみを保持します。OpenCL標準ではこれらのデータ解像度のみがサポートされているため、8,16,32、または64ビットのスカラデータ型を使用する必要があります。ただし、ハードウェアのコンパイルツールでハードウェア・リソースを節約するための最適化を実行できるように、ソースコードに適切なマスキング動作を組み込むことができます。

たとえば、アルゴリズムで17ビットのデータの固定小数点表現を使用する場合、値を格納するために32ビットのデータ型を使用する必要があります。その後、 Intel® FPGA SDK for OpenCL™オフライン・コンパイラー 2つの17ビット固定小数点値を一緒に追加するには、オフライン・コンパイラーが余分な上位15ビットの加算を処理するために余分なハードウェアを作成する必要があります。この追加のハードウェアが存在しないようにするには、スタティックビットマスクを使用して、ハードウェアのコンパイル中に不要なビットを無視するようにハードウェアのコンパイルツールに指示します。以下のコードはこのマスキング動作を実装しています。

__kernel fixed_point_add (__global const unsigned int * restrict a,
                          __global const unsigned int * restrict b,
                          __global unsigned int * restrict result)
{
	   size_t gid = get_global_id(0);

   	unsigned int temp;
   	temp = 0x3_FFFF & ((0x1_FFFF & a[gid]) + ((0x1_FFFF & b[gid]));

   	result[gid] = temp & 0x3_FFFF;
}

このコード例では、入力abの上位15ビットがマスクされて一緒に加算されます。 2つの17ビット値を加算した結果は18ビットの分解能を超えることができないため、オフライン・コンパイラーは追加のマスクを適用して結果の上位14ビットをマスクします。最終的なハードウェアの実装は、完全な32ビットの追加ではなく、17ビットの追加です。この例のロジックの節約は、FPGAで使用可能なハードウェア・リソースの数に比べて比較的少ないです。しかし、これらの小さな節約は、頻繁に適用されると、FPGA全体でより大きなハードウェア節約に蓄積されます。