Некоторые встроенные аппаратные цели исходно поддерживают специальные типы для половины точности, такие как _Float16
и _fp16
типы данных для ARM® компиляторы. Можно сгенерировать нативный код С полуточности для встроенных аппаратных целей, которые исходно поддерживают половину точности типы данных с плавающей точкой. Процесс, чтобы сгенерировать нативную половину кода С следующие:
Укажите новое аппаратное целевое устройство, которое исходно поддерживает половину точности с помощью target
пакет.
Настройте Simulink® модель для нативной половины генерации кода с новым целевым компьютером.
Сконфигурируйте набор инструментальных средств модели Simulink и настройте компилятор для половины точности.
Сгенерируйте нативную половину кода типа.
Fixed-Point Designer™ включает предварительно сконфигурированные реализации языка для компиляторов Armclang и GCC. Для других аппаратных целей можно задать пользовательскую реализацию языка на основе спецификаций оборудования.
В этом примере, Коре ARM®- Процессор используется в качестве аппаратной цели. Модель сконфигурирована, чтобы использовать эту цель ARM и набор инструментальных средств компилятора Armclang. Обратитесь к документации разработчика ARM для получения дальнейшей информации относительно использования типа данных полуточности на этом оборудовании. См. Компилятор Руки armclang Справочник: полуточность типы данных с плавающей точкой.
Используйте target.create
функция, чтобы создать цель процессора ARM Cortex-A, которая совместима с половиной точности.
arm_half = target.create('Processor', ... 'Manufacturer', "ARM Compatible", ... 'Name', 'ARM Cortex-A Half-Precision');
Добавьте реализацию языка. 32-битной версии Лязга для ARM включили половину точности по умолчанию. Использование target.get
получать целевой объект из внутренней базы данных.
li = target.get('LanguageImplementation',"Clang ARM 32-bit");
Замените реализацию языка по умолчанию для Коры ARM с Armclang.
arm_half.LanguageImplementations = li;
Используйте target.add
функция, чтобы добавить целевой объект во внутреннюю базу данных.
target.add(arm_half);
Откройте модель, для которой вы хотите сгенерировать нативный код С полуточности. Модель должна использовать типы данных полуточности и быть сконфигурирована для генерации кода.
model = 'simpleHalfModel';
open_system(model);
Опционально, включите параметр модели, Наследовали выходной тип с плавающей точкой, меньший, чем одинарная точность, чтобы распространить половину точности.
set_param(model,'InheritOutputTypeSmallerThanSingle','on');
Поставьте цель генерации кода к цели ARM, измененной для половины точности.
set_param(model, 'ProdEqTarget', 'on'); set_param(model, 'ProdHWDeviceType', 'ARM Compatible->ARM Cortex-A Half-Precision');
Укажите набор инструментальных средств компилятора Armclang согласно Setup и Сконфигурируйте Набор инструментальных средств Компилятора Armclang для Генерации кода.
Настройте набор инструментальных средств компилятора Armclang для генерации кода.
set_param(model,'SystemTargetFile','ert.tlc'); set_param(model,'GenCodeOnly','off'); set_param(model,'Toolchain','Armclang Compiler'); set_param(model,'BuildConfiguration','Specify');
Сконфигурируйте компилятор Armclang для пользовательских флагов C.
compilerOptions = get_param(model,'CustomToolchainOptions'); compilerIdx = find(strcmp(compilerOptions,'C Compiler'));
Добавьте флаги полуточности.
appendToCCompilerOptions = ' --target=arm-arm-none-eabi -mcpu=cortex-a75+fp16';
compilerOptions{ compilerIdx + 1 } = strcat( compilerOptions{ compilerIdx + 1 }, appendToCCompilerOptions );
Примените пользовательские опции набора инструментальных средств к модели.
set_param(model, 'CustomToolchainOptions', compilerOptions );
Можно подтвердить эти настройки в панели Code Generation диалогового окна Configuration Parameters.
Если модель была настроена для ARM целевой компьютер Cortex-A и набор инструментальных средств компилятора Armclang, можно сгенерировать код С. Можно только запустить исполняемый файл модели на цели ARM или эмуляторе.
Используйте slbuild
функционируйте, чтобы создать независимый исполняемый файл для модели.
slbuild(model);
Можно смотреть отчет генерации кода подтвердить, что пользовательский заголовок и определения типа используются.
Сгенерированный код использует нативный тип данных полуточности.
В этом примере процессор ARM Cortex-A используется в качестве аппаратной цели. Модель сконфигурирована, чтобы использовать эту цель ARM и набор инструментальных средств компилятора GCC.
Используйте target.create
функция, чтобы создать цель процессора ARM Cortex-A.
arm_half = target.create('Processor', ... 'Manufacturer', "ARM Compatible", ... 'Name', 'ARM Cortex-A Half-Precision');
Добавьте реализацию языка. 32-битной версии GCC для ARM включили половину точности по умолчанию. Используйте target.get
функция, чтобы получить целевой объект из внутренней базы данных.
li = target.get('LanguageImplementation',"GNU GCC ARM 32-bit");
Замените реализацию языка по умолчанию для Коры ARM с Armclang.
arm_half.LanguageImplementations = li;
Используйте target.add
функция, чтобы добавить целевой объект во внутреннюю базу данных.
target.add(arm_half);
В этом примере вы создаете новую пользовательскую реализацию языка с половиной точности для совместимой цели ARM.
Используйте target.create
функционируйте, чтобы скопировать реализацию языка Коры совместимого ARM ARM.
languageImplementation = target.create('LanguageImplementation','Name','ARM with half',... 'Copy','ARM Compatible-ARM Cortex');
Укажите пользовательскую половину информации и предназначайтесь для определенных заголовков, как дано вашей документацией целевого компьютера. Для получения дополнительной информации смотрите Регистр Новые Аппаратные устройства.
customHalf = target.create('FloatingPointDataType','Name','BCM2711 Half Type', ... 'TypeName','float16_T','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);
Этот пример использует Renesas® RH850, чтобы показать вам, как настроить цели не-ARM для половины точности.
Используйте target.create
функция, чтобы создать целевой процессор.
prh850 = target.create('Processor', ... 'Manufacturer', 'Renesas', ... 'Name', 'Renesas-RH850 With Half', ... 'Copy', 'Renesas-RH850');
Добавьте реализацию языка.
li = target.create('LanguageImplementation',... 'Name', 'Renesas-RH850 with Half', ... 'Copy', 'Renesas-RH850');
Предоставьте дополнительную информацию пользовательская реализация полуточности для этого оборудования.
customHalf = target.create('FloatingPointDataType', 'Name', 'Renesas Half Type'); customHalf.TypeName = '__fp16'; customHalf.Size = 16; customHalf.LiteralSuffix = ''; customHalf.SystemIncludes = '';
Добавьте пользовательский тип данных полуточности.
li.DataTypes.NonStandardDataTypes = customHalf; prh850.LanguageImplementations = li;
Используйте target.add
функция, чтобы добавить целевой объект во внутреннюю базу данных.
target.add(prh850);
target.FloatingPointDataType
| target.add
| target.create
| target.get
| target.remove