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

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

3.3. 浮動小数点演算の最適化

浮動小数点演算の場合、 Intel® FPGA SDK for OpenCL™オフライン・コンパイラーハードウェアでより効率的なパイプライン構造を作成し、ハードウェア全体の使用を削減する最適化を実行します。 これらの最適化は、浮動小数点結果の小さな違いを引き起こす可能性があります。

ツリーのバランス

動作規則の順序はOpenCL™言語で適用されます。次の例では、オフライン・コンパイラーは最も内側の括弧内の演算から始まる厳密な順序で乗算と加算を実行します。

result = (((A * B) + C) + (D * E)) + (F * G);

デフォルトでは、オフライン・コンパイラーは、そのような計算のためにロングブレインに似た実装を作成します。

図 60. デフォルトの浮動小数点実装


長くて不均衡な動作は、より高価なハードウェアにつながります。より効率的なハードウェア実装は、以下に示すようにバランスの取れたツリーです 。

図 61. 平衡化されたツリー浮動小数点実装


バランスの取れたツリーの実装では、オフライン・コンパイラーは、長いブレインの浮動小数点加算器をツリーパイプライン構造に変換します。オフライン・コンパイラーは、浮動小数点演算の結果が異なるため、浮動小数点演算のツリー・バランシングを自動的に実行しません。その結果、この最適化はIEEE標準754-2008と矛盾します。

オフライン・コンパイラーで平衡ツリーを使用して浮動小数点演算を最適化し、プログラムが浮動小数点結果の小さな違いを許容できるようにするには、次のように-fp-relaxedオプションをaocコマンドに含めます。

aoc -fp-relaxed <your_kernel_filename>.cl

丸め動作

浮動小数点演算の平衡化ツリーの実装には、複数回の丸め演算が含まれます。これらの丸め処理では、一部のアプリケーションでは相当量のハードウェア・リソースが必要になる場合があります。オフライン・コンパイラーは、IEEE Standard 754-2008で要求される結果に違反するため、丸め処理の回数を自動的に減らすことはありません。

aocコマンドの-fpcオプションを使用して浮動小数点演算を実装するために必要なハードウェアの量を減らすことができます。プログラムで浮動小数点結果の小さな違いを許容できる場合、次のコマンドを呼び出します。

aoc -fpc <your_kernel_filename>.cl

-fpcオプションを指定すると、オフライン・コンパイラーは次のタスクを実行します。

  • 可能であれば、浮動小数点丸め演算と変換を削除してください。

    可能であれば、 -fpc引数は、浮動小数点演算のツリーの最後で、浮動小数点演算を1回だけ丸めるようにオフライン・コンパイラーに指示します。

  • 精度を維持するために追加の仮数ビットを持ちます。

    オフライン・コンパイラーは、浮動小数点演算を介して追加の精度ビットを持ち、浮動小数点演算のツリーの最後でこれらの精度ビットを削除します。

このタイプの最適化は、融合された浮動小数点演算を実行するハードウェアをもたらし、多くの新しいハードウェア処理システムの機能です。複数の浮動小数点演算を融合すると、丸めステップの数が最小限に抑えられ、より正確な結果が得られます。この最適化の一例は、新しいプロセッサーアーキテクチャで使用可能なFMAC(fused multiply-accumulate)命令です。オフライン・コンパイラーは、カーネル内の浮動小数点演算子の多くの組み合わせに対して、融合した浮動小数点数学機能を提供できます。