主要内容

代码替换的数据对齐

代码替换库可以将传递给替换函数的数据对象对齐到指定的边界。

代码替换数据对齐

您可以利用需要对齐数据的函数实现来优化应用程序性能。为函数实现配置数据对齐:

  1. 在代码替换条目中指定数据对齐要求。为每个实现函数参数分别指定对齐方式,或为所有函数参数共同指定对齐方式。看到指定函数参数的数据对齐要求

  2. 指定一个或多个编译器的数据对齐功能和语法。中库注册项中的对齐规范rtwTargetInfo.m文件。看到为编译器提供数据对齐规范

  3. 注册包含表项和对齐规范对象的库。

  4. 配置代码生成器以使用代码替换库并生成代码。观察结果。

有关示例,请参见代码替换数据对齐的基本示例的“函数实现的数据对齐”部分通过开发和使用代码替换库- Simulink®优化生成的代码金宝app示例页面。

指定函数参数的数据对齐要求

在代码替换条目中指定参数的数据对齐要求:

  • 如果要在代码替换表注册文件中定义替换函数,请创建参数描述符对象(环球套票。ArgumentDescriptor)。使用它的AlignmentBoundary属性指定所需的对齐边界并将对象赋给参数描述符财产。

  • 方法定义替换函数代码替换工具,在映射信息选项卡,在参数属性节为替换函数,输入值为对齐值参数。

AlignmentBoundary财产(或对齐值参数)指定传递给函数参数的数据的对齐边界,以字节数为单位。的AlignmentBoundary属性仅对可寻址对象有效,包括矩阵和指针参数。它不适用于值参数。有效值为:

  • -1(默认值)—如果数据为金宝app仿真软件。公共汽车金宝app仿真软件。信号,或金宝app仿真软件。参数对象指定代码生成器根据使用情况确定最佳对齐方式。否则,指定此参数没有对齐要求。

  • 2的幂的正整数,不超过128 -边界的字节数。为函数参数分配的数据的起始内存地址是指定值的倍数。如果指定的对齐边界小于参数数据类型的自然对齐,则在生成的代码中发出对齐指令。但是,目标编译器会忽略该指令。

下面的代码指定AlignmentBoundary对于参数为16字节。

hLib = RTW.TflTable;entry = RTW.TflCOperationEntry;参数= getTflArgFromString(hLib,‘u1’“单*”);desc = RTW.ArgumentDescriptor;desc.AlignmentBoundary = 16;参数。描述符=描述;entry.Implementation.addArgument (arg);

代码替换工具对话框中的等效对齐边界规范如下图所示。

请注意

如果你的模型导入金宝app仿真软件。公共汽车金宝app仿真软件。参数,或金宝app仿真软件。信号对象,在对象属性中指定对齐边界对齐财产。有关更多信息,请参见金宝app仿真软件。公共汽车金宝app仿真软件。参数,金宝app仿真软件。信号

为编译器提供数据对齐规范

若要在金宝app生成的代码中支持数据对齐,请在代码替换库注册中描述编译器的数据对齐功能和语法。为库注册表项中的每个编译器提供一个或多个对齐规范。

描述编译器的数据对齐功能和语法:

  • 类中定义代码替换库注册项rtwTargetInfo.m自定义文件,添加一个或多个AlignmentSpecification对象的环球套票。DataAlignment对象。附加环球套票。DataAlignment对象的TargetCharacteristics注册表项的对象。

    环球套票。DataAlignment对象也具有属性DefaultMallocAlignment,它以字节为单位指定编译器用于动态分配内存的默认对齐边界。如果代码生成器对代码替换中涉及的数据对象使用动态内存分配,则此值确定内存是否满足替换的对齐要求。如果不是,则代码生成器不使用替换。的默认值DefaultMallocAlignment-1,表示用于动态分配内存的默认对齐边界是未知的。在这种情况下,代码生成器使用数据类型的自然对齐来确定是否允许替换。

    属性指定复杂类型的对齐边界addComplexTypeAlignment函数。

  • 如果使用“代码替换工具”生成自定义文件函数,请为每个编译器填写以下字段。

    单击加号(+)可添加其他编译器规范。

对于每个数据对齐规范,提供以下信息。

AlignmentSpecification财产

对话框参数

描述

AlignmentType

对齐类型

预定义枚举字符串的单元格数组,指定此规范支持哪种对齐类型。金宝app

  • DATA_ALIGNMENT_LOCAL_VAR—本地变量。

  • DATA_ALIGNMENT_GLOBAL_VAR—全局变量。

  • DATA_ALIGNMENT_STRUCT_FIELD—单个结构字段。

  • DATA_ALIGNMENT_WHOLE_STRUCT-整个结构,带填充(单个结构字段对齐,如果指定,优先于整个结构对齐)。

每个对齐规范必须至少指定DATA_ALIGNMENT_GLOBAL_VAR而且DATA_ALIGNMENT_STRUCT_FIELD

AlignmentPosition

对齐的位置

预定义枚举字符串,指定必须将编译器对齐指令置于对齐类型的位置DATA_ALIGNMENT_WHOLE_STRUCT

  • DATA_ALIGNMENT_PREDIRECTIVE—对齐指令之前发出struct st_tag{…},作为类型定义语句的一部分(例如MSVC)。

  • DATA_ALIGNMENT_POSTDIRECTIVE—之后发出对齐指令struct st_tag{…},作为类型定义语句的一部分(例如,gcc)。

  • DATA_ALIGNMENT_PRECEDING_STATEMENT-对齐指令作为一个独立的语句发出,紧接在结构类型定义之前。分号(;)必须终止已注册的对齐语法。

  • DATA_ALIGNMENT_FOLLOWING_STATEMENT-对齐指令作为一个独立的语句紧随结构类型的定义而发出。分号(;)必须终止已注册的对齐语法。

对于对齐类型以外的DATA_ALIGNMENT_WHOLE_STRUCT,代码生成使用对齐位置DATA_ALIGNMENT_PREDIRECTIVE

AlignmentSyntaxTemplate

对齐的语法

指定编译器支持的对齐指令字符串。金宝app该字符串被注册为语法模板,其中有占位符。支持以下占位符:金宝app

  • % n-替换为替换函数参数的对齐边界。

  • % s—替换为已对齐的符号,通常为变量的标识符。

例如,对于gcc编译器,您可以指定__attribute__((对齐(% n))),或MSVC编译器,使用__declspec(对齐(% n))

金宝appSupportedLanguages

金宝app支持的语言

指定此对齐规范应用于的语言的单元格数组,其中c而且c++.有时候,不同语言的编译器的对齐语法和位置不同。

下面是GCC编译器的数据对齐规范:

da = RTW.DataAlignment;as = RTW.AlignmentSpecification;作为。AlignmentType = {“DATA_ALIGNMENT_LOCAL_VAR”...“DATA_ALIGNMENT_STRUCT_FIELD”...“DATA_ALIGNMENT_GLOBAL_VAR”};作为。AlignmentSyntaxTemplate =“使用__attribute__((对齐(% n)))”;作为。AlignmentPosition =“DATA_ALIGNMENT_PREDIRECTIVE”;作为。金宝app支持的语言= {“c”“c++”};da.addAlignmentSpecification ();tc = rtw .目标特征;tc。数据对齐= da;

这里是相应的规格生成的定制对话框的代码替换工具。

代码替换数据对齐的基本示例

为代码替换指定的数据对齐完整工作流的一个简单示例是:

  1. 创建并保存以下代码替换表定义文件,crl_table_mmul_4x4_single_align.m.该表定义了*(乘法)运算符的替换项数据类型和输入维(4, 4).条目还为每个替换函数参数指定了16字节的数据对齐边界。该条目表示,在代码生成期间为函数参数分配的数据的起始内存地址必须是16的倍数。

    函数hLib = crl_table_mmul_4x4_single_alignCRL_TABLE_MMUL_4x4_SINGLE_ALIGN -用数据对齐描述矩阵运算符条目hLib = RTW.TflTable;entry = RTW.TflCOperationEntry;setTflCOperationEntryParameters(条目,...“关键”“RTW_OP_MUL”...“优先”, 90,...“ImplementationName”“matrix_mul_4x4_s”);%概念论证createAndAddConceptualArg(条目,“环球套票。TflArgMatrix”...“名字”“日元”...“IOType”“RTW_IO_OUTPUT”...“基类型”“单一”...“DimRange”, [4 4]);createAndAddConceptualArg(条目,“环球套票。TflArgMatrix”...“名字”‘u1’...“基类型”“单一”...“DimRange”, [4 4]);createAndAddConceptualArg(条目,“环球套票。TflArgMatrix”...“名字”“u2”...“基类型”“单一”...“DimRange”, [4 4]);%实现参数参数= getTflArgFromString(hLib,“日元”“空白”);参数。IOType =“RTW_IO_OUTPUT”;entry.Implementation.setReturn (arg);参数= getTflArgFromString(hLib,“日元”“单*”);参数。IOType =“RTW_IO_OUTPUT”;desc = RTW.ArgumentDescriptor;desc.AlignmentBoundary = 16;参数。描述符=描述;entry.Implementation.addArgument (arg);参数= getTflArgFromString(hLib,‘u1’“单*”);desc = RTW.ArgumentDescriptor;desc.AlignmentBoundary = 16;参数。描述符=描述;entry.Implementation.addArgument (arg);参数= getTflArgFromString(hLib,“u2”“单*”);desc = RTW.ArgumentDescriptor;desc.AlignmentBoundary = 16;参数。描述符=描述;entry.Implementation.addArgument (arg);hLib.addEntry(入口);
  2. 创建并保存以下注册文件,rtwTargetInfo.m.如果要编译本例中生成的代码,请先修改AlignmentSyntaxTemplate属性用于您使用的编译器。例如,对于MSVC编译器,替换gcc模板规范__attribute__((对齐(% n)))使用__declspec(对齐(% n))

    函数rtwTargetInfo (cm)rtwTargetInfo函数注册一个代码替换库(CRL)%用于代码生成注册本地函数locCrlRegFcn中定义的CRLcm.registerTargetInfo (@locCrlRegFcn);结束% RTWTARGETINFO结束本地函数,定义包含crl_table_mmul_4x4_single_align的CRL函数thisCrl = locCrlRegFcn%创建一个对齐规范对象,假设GCCas = RTW.AlignmentSpecification;作为。AlignmentType = {“DATA_ALIGNMENT_LOCAL_VAR”...“DATA_ALIGNMENT_GLOBAL_VAR”...“DATA_ALIGNMENT_STRUCT_FIELD”};作为。AlignmentSyntaxTemplate =“使用__attribute__((对齐(% n)))”;作为。金宝appSupportedLanguages = {“c”“c++”};添加对齐规范对象da = RTW.DataAlignment;da.addAlignmentSpecification ();将数据对齐对象添加到目标特征tc = rtw .目标特征;tc。数据对齐= da;实例化CRL注册表项thisCrl = RTW.TflRegistry;%定义CRL属性thisCrl。Name =“数据对齐示例”;thisCrl。描述=“用数据对齐替换的例子”;thisCrl。TableList = {“crl_table_mmul_4x4_single_align”};thisCrl。目标特征= tc;结束LOCCRLREGFCN结束
  3. 注册你的库与代码生成器,而不必重新启动MATLAB®,输入如下命令:

    RTW.TargetRegistry.getInstance (“重置”);
  4. 配置代码生成器以使用代码替换库。

  5. 生成代码和代码生成报告。

  6. 检查代码替换。例如,检查乘法运算是否被替换为matrix_mul_4x4_s函数调用。在mmalign.h,检查GCC对齐指令是否正确__attribute__((对齐(16)))用于对齐函数变量。

相关的话题