Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

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.addを使用して、内部データベースにターゲット オブジェクトを追加します。

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

コード生成レポートを調べて、カスタムの半精度型定義が使用されていることを確認できます。

native_half_type_def.png

半精度定数で f16 接尾辞が使用されています。

native-half-constants-fp16-suffix.png

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);

参考

| | | | |

関連するトピック

外部の Web サイト