ALU、スカラー関数、およびデータ型変換

Versal アダプティブ SoC AI エンジン アーキテクチャ マニュアル (AM009)

Document ID
AM009
Release Date
2023-08-18
Revision
1.3 日本語

AI エンジンの論理演算ユニット (ALU) は、次の演算を実行します。いずれの場合も、発行レートは 1 サイクルあたり 1 命令です。

  • 整数の加算および減算: 32 ビット。この演算のレイテンシは 1 サイクルです。
  • 32 ビット整数に対するビット論理演算 (BAND、BOR、BXOR)。この演算のレイテンシは 1 サイクルです。
  • 整数の乗算: 32 x 32 ビット。32 ビットの結果を R レジスタ ファイルに格納します。この演算のレイテンシは 3 サイクルです。
  • シフト演算: 左シフトと右シフトの両方をサポート。シフト量が正の場合は左シフト、負の場合は右シフトを実行します。シフト量は汎用レジスタを使用して渡します。シフト演算で正と負のどちらのシフトが必要かは、1 ビットのオペランドで示します。この演算のレイテンシは 1 サイクルです。

AI エンジンには、固定小数点と浮動小数点の 2 種類のスカラー初等関数があります。次に、各関数について説明します。

  • 固定小数点非線形関数
    • サインおよびコサイン
      • 32 ビット入力の上位 20 ビットを入力
      • 上位 16 ビットのサインと下位 16 ビットのコサインを 1 ワードに連結して出力
      • これら演算のレイテンシは 4 サイクルです。
    • 絶対値 (ABS): 入力値を反転して 1 を加算。この演算のレイテンシは 1 サイクルです。
    • CLZ (Count Leading Zeroes): 32 ビット入力の先行ゼロの数。この演算のレイテンシは 1 サイクルです。
    • 最小値/最大値 (< (LG)/> (GT)):2 つの入力を比較して最小値または最大値を求める。この演算のレイテンシは 1 サイクルです。
    • 平方根、逆平方根、および逆数: これらの演算は浮動小数点精度で実装されます。固定小数点実装では、入力をまず浮動小数点精度に変換してからこれら非線形関数の入力として渡す必要があります。また、出力は浮動小数点フォーマットであるため、固定小数点整数フォーマットへ戻す必要があります。これら演算のレイテンシは 4 サイクルです。
  • 浮動小数点非線形関数
    • 平方根: 入力と出力はいずれも単精度浮動小数点数で、R レジスタ ファイルに対して演算を実行します。この演算のレイテンシは 4 サイクルです。
    • 逆平方根:入力と出力はいずれも単精度浮動小数点数で、R レジスタ ファイルに対して演算を実行します。この演算のレイテンシは 4 サイクルです。
    • 逆数: 入力と出力はいずれも単精度浮動小数点数で、R レジスタ ファイルに対して演算を実行します。この演算のレイテンシは 4 サイクルです。
    • 絶対値 (ABS): この演算のレイテンシは 1 サイクルです。
    • 最小値/最大値: この演算のレイテンシは 1 サイクルです。

スカラー ユニットには浮動小数点演算ユニットはありません。浮動小数点演算は、エミュレーションでサポートされています。一般的に、加算と乗算はベクトル ユニットで実行することが推奨されます。

AI エンジンのスカラー ユニットは、入力データを固定小数点と浮動小数点の間で双方向に変換するデータ型変換をサポートしています。fix2float 演算と float2fix 演算は、32 ビット値の入力に対して可変小数点をサポートしています。32 ビット値と小数点位置の両方を入力として与えます。この演算は、必要に応じて値を拡大または縮小します。いずれの演算もレイテンシは 1 サイクルです。

AI エンジンの浮動小数点は、IEEE 規格に完全に準拠しているわけではなく、一部の機能には制限があります。例外は次のとおりです。

  • float2fix 関数の引数が非常に大きな正数または負数で、追加の指数インクリメントがゼロより大きい場合、この命令は正しい飽和値である 231–1 または –231 ではなく、0 を返します。

    float2fix 関数には、入力パラメーターが 2 つあります。

    • n: 変換される浮動小数点の入力値。
    • sft: 固定小数点表記の小数ビット数を表す 6 ビットの符号付き数値 (-32 ~ 31)。

    次に 2 つの例を紹介します。

    • n*2sft > 2129 の場合、出力は 0x7FFFFFFF を返すはずが、代わりに、0x00000000 を返す。
    • n*2sft < –2129 の場合、出力は 0X80000000 を返すはずが、代わりに、0x00000000 を返す。

    通常、浮動小数点の入力値 n は、バグのない範囲 (sft > 0 の場合に –2(129–sft) < n < 2(129–sft)) 内にする必要があります。

    対処方法として、次の 2 つがあります。

    • float2fix_safe: オプションなしで float2fix を指定する場合のデフォルト モードです。この場合、任意の範囲に対して正しい値が返されますが、低速になります。
    • float2fix_fast: バグのない範囲のみでの正しい値が返されるので、その範囲が有効であることを確認する必要があります。floatfix_fast を選択する場合は、プロジェクト ファイルにプリプロセッサの FLOAT2FIX_FAST を追加する必要があります。
  • 固定小数点値の有効範囲は、–231 ~ 231–1 です。float2fix 関数が –231 を返す場合、この値は範囲内ですが、オーバーフロー例外が正しく設定されません。このオーバーフロー例外への対処法はありません。