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

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

5.6. 任意精度での整数の実装

インテル® FPGA SDK for OpenCL™ の任意精度での整数拡張を使用し、カスタムビット幅で整数を定義します。整数のカスタムビット幅は、最大64ビットまで定義できます。

任意精度の整数拡張機能を使用するには、カーネルコードのヘッダーファイルのリストに次の行を含めます。
#include "ihc_apint.h"
ihc_apint.hヘッダーファイルを含むカーネルをコンパイルする際は、-I $INTELFPGAOCLSDKROOT/include/kernel_headersオプションをaocコマンドとともに含める必要があります。以下に例を示します。
aoc <other command options> -I $INTELFPGAOCLSDKROOT/include/kernel_headers <my_kernel_file>
ヘッダーは、任意精度の整数拡張を有効にし、符号付きおよび符号なしの任意精度の整数に対するCスタイル宣言を定義するマクロを次のように備えています。
#define ap_int<d> intd_t
#define ap_uint<d> uintd_t
例えば10ビットの符号付きおよび符号なしの任意精度の整数は、次のように宣言できます。
int10_t x_signed;
uint10_t x_unsigned;

任意精度の整数は、最大64ビット幅まで宣言することが可能です。

ヘッダーファイルを使用せずに整数を任意の精度で利用するには、次のプラグマ・ディレクティブで拡張を有効にします。
#pragma OPENCL EXTENSION cl_intel_arbitrary_precision_integers : enable
プラグマ宣言の後、次のように任意の精度で整数を宣言することができます。
ap_int<d> intd_t my_signed_integer
ap_uint<d> uintd_t my_unsigned_integer

結果のビット幅が引数のビット幅より大きい演算を行う場合は、引数の1つを結果のビット幅に明示的にキャストする必要があります。

例えば次の演算を行った場合、結果は宣言された整数のサイズをオーバーフローします。
int10_t a;
int10_t b;
int20_t res;

res = a * b;

この例においてコンパイラーは、2つの10ビットの整数を乗算する乗数をインスタンス化し、結果を別の10ビットの整数に納めようと試みます。結果は符号拡張されるか、20ビットまでゼロ拡張されます。

オーバーフローを防ぐには、次のように引数の1つを結果のビット幅に明示的にキャストします。
res = ((int20_t)a) * b
要確認:

x86-64のプラットフォームに向けてプログラムをコンパイルすると、任意の精度での整数のビット幅は32ビットまたは64ビットに切り上げられます。FPGAプラットフォームにカーネルをコンパイルすると、ビット幅は切り上げられず、任意の精度の整数は宣言されたビット幅のまま維持されます。

その結果、x86-64のプログラムで正しく動作するように見える演算をFPGAカーネルにコンパイルすると、オーバーフローし精度を失う可能性があります。x86-64プラットフォームにおいて、ビット幅を切り上げることで与えられる追加精度は、FPGAカーネルのコンパイル時に発生する可能性があるオーバーフローと、精度損失の問題をマスクします。