MATLAB Coder を使用したネイティブ半精度 C コードの生成
組み込みハードウェア ターゲットの中には、ARM® コンパイラの _Float16
データ型や _fp16
データ型など、半精度の特殊な型をネイティブにサポートするものもあります。MATLAB® Coder™ を使用して、半精度浮動小数点データ型をネイティブにサポートする ARM Cortex®-A プロセッサ用のネイティブ半精度 C コードを生成できます。
ネイティブ half C コードを生成する手順は次のとおりです。
target
パッケージを使用して、半精度をネイティブにサポートする新しいハードウェア ターゲット デバイスを登録する。コード生成構成を半精度用に設定する。
ネイティブ half 型コードを生成する。
Fixed-Point Designer™ と MATLAB Coder には、Armclang コンパイラおよび GCC コンパイラ用に事前構成された言語実装が含まれています。その他のハードウェア ターゲットについては、ハードウェア仕様に基づいてカスタム言語実装を指定できます。
GCC コンパイラを使用する ARM® Cortex®-A 用のネイティブ半精度 C コードの生成
この例では、ハードウェア ターゲットとして ARM Cortex®-A プロセッサが使用されます。モデルは、この ARM ターゲットと GNU GCC コンパイラ ツールチェーンを使用するように構成されます。
ターゲット ハードウェアの登録
関数 target.create を使用して、半精度と互換性のある ARM プロセッサ ターゲットを作成します。
arm_half = target.create('Processor','Manufacturer',"Broadcom",'Name','BCM2711 ARM Cortex A72');
言語実装を追加します。関数 target.get を使用して、内部データベースからターゲット オブジェクトを取得します。
li = target.get('LanguageImplementation',"GNU GCC ARM 32-bit");
ARM Cortex 用の既定の言語実装を Armclang に置き換えます。
arm_half.LanguageImplementations = li;
関数 target.get を使用して、内部データベースにターゲット オブジェクトを追加します。
target.add(arm_half);
target.add summary: Objects added to internal database for current MATLAB session: target.Processor "Broadcom-BCM2711 ARM Cortex A72" 1 object not added because they already exist.
半精度データ型を使用する MATLAB コードを開く
edit testNativeHalffp16.m
コード生成構成の半精度用の設定
コード生成構成オブジェクトを作成します。
cfg = coder.config('lib');
製品ハードウェアのデバイス タイプを指定します。
cfg.HardwareImplementation.ProdHWDeviceType = 'Broadcom->BCM2711 ARM Cortex A72';
選択したハードウェアと互換性のあるツールチェーンを選択します。
cfg.Toolchain = 'GNU Tools for ARM Embedded Processors';
コンパイルのために半精度フラグを追加します。
cfg.BuildConfiguration = 'Specify'; cfg.CustomToolchainOptions{4} = '-c -MMD -MP -MF"$(@:%.o=%.dep)" -MT"$@" -O0 -mfp16-format=ieee -mfpu=neon-fp16';
コードの生成
codegen testNativeHalffp16 -args {half(3)} -launchreport -config cfg
コード生成レポートを調べて、カスタムの半精度型定義が使用されていることを確認できます。
半精度定数で f16
接尾辞が使用されています。
Armclang コンパイラを使用する ARM Cortex-A 用のネイティブ半精度 C コードの生成
この例では、ハードウェア ターゲットとして ARM Cortex-A プロセッサが使用されます。モデルは、この ARM ターゲットと Armclang コンパイラ ツールチェーンを使用するように構成されます。
ターゲット ハードウェアの登録
関数 target.create
を使用して、半精度と互換性のある ARM プロセッサ ターゲットを作成します。
arm_half = target.create('Processor',... 'Manufacturer',"Broadcom",... 'Name','ARM Cortex A75');
言語実装を追加します。関数 target.get
を使用して、内部データベースからターゲット オブジェクトを取得します。
li = target.get('LanguageImplementation',"Clang ARM 32-bit");
ARM Cortex 用の既定の言語実装を Armclang に置き換えます。
arm_half.LanguageImplementations = li;
関数 target.add
を使用して、内部データベースにターゲット オブジェクトを追加します。
target.add(arm_half);
コード生成構成の半精度用の設定
コード生成構成オブジェクトを作成します。
cfg = coder.config('lib');
製品ハードウェアのタイプを指定します。
cfg.HardwareImplementation.ProdHWDeviceType = 'Broadcom->ARM Cortex A75';
選択したハードウェアと互換性のあるツールチェーンを選択します。
cfg.Toolchain = 'Armclang Compiler';
コンパイルのために半精度フラグを追加します。
cfg.BuildConfiguration = 'Specify'; cfg.CustomToolchainOptions{4} = '-c -MMD -MP -MF"$(@:%.o=%.dep)" -MT"$@" -O0 --target=arm-arm-none-eabi -march=armv8.2-a+fp16';
コードの生成
codegen testNativeHalffp16 -args {half(3)} -launchreport -config cfg
カスタム言語実装を使用する ARM ターゲット ハードウェアの登録
この例では、互換性のある ARM ターゲット用に半精度の新しいカスタム言語実装を作成します。
ターゲット ハードウェアの登録
関数 target.create
を使用して、ARM Compatible-ARM Cortex 言語実装をコピーします。
languageImplementation = target.create('LanguageImplementation',... 'Name','ARM with half',... 'Copy','ARM Compatible-ARM Cortex');
ターゲット ハードウェアのドキュメンテーションの記載に従って、カスタムの half 情報とターゲット固有のヘッダーを指定します。詳細については、新しいハードウェア デバイスの登録を参照してください。たとえば、次のようにします。
customHalf = target.create('FloatingPointDataType',... 'Name','BCM2711 Half Type', ... 'TypeName','_Float16',... 'LiteralSuffix','f16',... 'Size',16, ... 'SystemIncludes',["arm_fp16.h" "arm_neon.h"]); languageImplementation.DataTypes.NonStandardDataTypes = customHalf;
ターゲット プロセッサに関する情報を提供します。たとえば、次のようにします。
% Broadcom BCM2711 % Quad core Cortex-A72 (ARM v8) 64-bit SoC pi4a72 = target.create('Processor','Manufacturer',... 'Broadcom','Name','BCM2711');
カスタムの半精度言語実装を追加します。
pi4a72.LanguageImplementations = languageImplementation;
関数 target.add
を使用して、内部データベースにターゲット オブジェクトを追加します。
target.add(pi4a72);
参考
half
| target.FloatingPointDataType
| target.add
| target.create
| target.get
| target.remove
関連するトピック
外部の Web サイト
- Clang Language Extensions for Half-Precision Floating Point
- Arm Compiler armclang Reference Guide: Half-precision floating-point data types
- GCC Half-Precision Floating Point
- Reduce the Program Data Size with Ease! Introducing Half-Precision Floating-Point Feature in Renesas Compiler Professional Edition