代码替换的数据对齐
代码替换库可以将传递给替换函数的数据对象对齐到指定的边界。
代码替换数据对齐
您可以利用需要对齐数据的函数实现来优化应用程序性能。为函数实现配置数据对齐:
在代码替换条目中指定数据对齐要求。为每个实现函数参数分别指定对齐方式,或为所有函数参数共同指定对齐方式。看到指定函数参数的数据对齐要求.
指定一个或多个编译器的数据对齐功能和语法。中库注册项中的对齐规范
rtwTargetInfo.m
文件。看到为编译器提供数据对齐规范.注册包含表项和对齐规范对象的库。
配置代码生成器以使用代码替换库并生成代码。观察结果。
有关示例,请参见代码替换数据对齐的基本示例的“函数实现的数据对齐”部分通过开发和使用代码替换库- Simulink®优化生成的代码万博1manbetx示例页面。
指定函数参数的数据对齐要求
在代码替换条目中指定参数的数据对齐要求:
如果要在代码替换表注册文件中定义替换函数,请创建参数描述符对象(
环球套票。ArgumentDescriptor
).使用它的AlignmentBoundary
属性指定所需的对齐边界并将对象赋给参数描述符
财产。方法定义替换函数代码替换工具,在映射信息选项卡,在参数属性节为替换函数,输入值为对齐值参数。
的AlignmentBoundary
财产(或对齐值参数)指定传递给函数参数的数据的对齐边界,以字节数为单位。的AlignmentBoundary
属性仅对可寻址对象有效,包括矩阵和指针参数。它不适用于值参数。有效值为:
-1
(默认值)—如果数据为万博1manbetx仿真软件。公共汽车
,万博1manbetx仿真软件。信号
,或万博1manbetx仿真软件。参数
对象指定代码生成器根据使用情况确定最佳对齐方式。否则,指定此参数没有对齐要求。2的幂的正整数,不超过128 -边界的字节数。为函数参数分配的数据的起始内存地址是指定值的倍数。如果指定的对齐边界小于参数数据类型的自然对齐,则在生成的代码中发出对齐指令。但是,目标编译器会忽略该指令。
下面的代码指定AlignmentBoundary
对于参数为16字节。
hLib = RTW.TflTable;entry = RTW.TflCOperationEntry;参数= getTflArgFromString(hLib,‘u1’,“单*”);desc = RTW.ArgumentDescriptor;desc.AlignmentBoundary = 16;参数。描述符=描述;entry.Implementation.addArgument (arg);
代码替换工具对话框中的等效对齐边界规范如下图所示。
请注意
如果你的模型导入万博1manbetx仿真软件。公共汽车
,万博1manbetx仿真软件。参数
,或万博1manbetx仿真软件。信号
对象,在对象属性中指定对齐边界对齐财产。有关更多信息,请参见万博1manbetx仿真软件。公共汽车
,万博1manbetx仿真软件。参数
,万博1manbetx仿真软件。信号
.
为编译器提供数据对齐规范
若要在万博1manbetx生成的代码中支持数据对齐,请在代码替换库注册中描述编译器的数据对齐功能和语法。为库注册表项中的每个编译器提供一个或多个对齐规范。
描述编译器的数据对齐功能和语法:
类中定义代码替换库注册项
rtwTargetInfo.m
自定义文件,添加一个或多个AlignmentSpecification
对象的环球套票。DataAlignment
对象。附加环球套票。DataAlignment
对象的TargetCharacteristics
注册表项的对象。的
环球套票。DataAlignment
对象也具有属性DefaultMallocAlignment
,它以字节为单位指定编译器用于动态分配内存的默认对齐边界。如果代码生成器对代码替换中涉及的数据对象使用动态内存分配,则此值确定内存是否满足替换的对齐要求。如果不是,则代码生成器不使用替换。的默认值DefaultMallocAlignment
是-1
,表示用于动态分配内存的默认对齐边界是未知的。在这种情况下,代码生成器使用数据类型的自然对齐来确定是否允许替换。属性指定复杂类型的对齐边界
addComplexTypeAlignment
函数。如果使用“代码替换工具”生成自定义文件函数,请为每个编译器填写以下字段。
单击加号(+)可添加其他编译器规范。
对于每个数据对齐规范,提供以下信息。
|
对话框参数 |
描述 |
---|---|---|
|
对齐类型 |
预定义枚举字符串的单元格数组,指定此规范支持哪种对齐类型。万博1manbetx
每个对齐规范必须至少指定 |
|
对齐的位置 |
预定义枚举字符串,指定必须将编译器对齐指令置于对齐类型的位置
对于对齐类型以外的 |
|
对齐的语法 |
指定编译器支持的对齐指令字符串。万博1manbetx该字符串被注册为语法模板,其中有占位符。支持以下占位符:万博1manbetx
例如,对于gcc编译器,您可以指定 |
|
万博1manbetx支持的语言 |
指定此对齐规范应用于的语言的单元格数组,其中 |
下面是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”;作为。万博1manbetx支持的语言= {“c”,“c++”};da.addAlignmentSpecification ();tc = rtw .目标特征;tc。数据对齐= da;
这里是相应的规格生成的定制对话框的代码替换工具。
代码替换数据对齐的基本示例
为代码替换指定的数据对齐完整工作流的一个简单示例是:
创建并保存以下代码替换表定义文件,
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,“日元”,“单*”);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(入口);
创建并保存以下注册文件,
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)))”;作为。万博1manbetxSupportedLanguages = {“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结束
注册你的库与代码生成器,而不必重新启动MATLAB®,输入如下命令:
RTW.TargetRegistry.getInstance (“重置”);
配置代码生成器以使用代码替换库。
生成代码和代码生成报告。
检查代码替换。例如,检查乘法运算是否被替换为
matrix_mul_4x4_s
函数调用。在mmalign.h
,检查GCC对齐指令是否正确__attribute__((对齐(16)))
用于对齐函数变量。