文档

代码替换数据对齐

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

代码替换数据对齐

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

  1. 代码替换条目中指定数据的对齐要求。为每个实现函数参数指定对齐单独或集体所有函数参数。看到函数参数指定数据一致性要求

  2. 指定数据对齐功能和一个或多个编译器的语法。包括对齐规范在图书馆登记进入rtwTargetInfo.m文件。看到为编译器提供数据校准规范

  3. 注册库包含表条目和校准规范的对象。

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

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

函数参数指定数据一致性要求

指定数据的对齐要求代码替换条目中一个论点:

  • 如果你定义一个替换函数的代码替换表登记文件,创建一个参数描述符对象(RTW.ArgumentDescriptor)。使用它的AlignmentBoundary属性来指定所需的对齐边界和分配对象的说法描述符财产。

  • 如果你定义一个使用替换功能代码替换工具,在映射信息选项卡,参数属性部分替代函数,输入一个值对齐值参数。

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

  • 1(默认)——如果数据金宝appSimulink.Bus,金宝appSimulink.Signal,或金宝appSimulink.Parameter对象,指定代码生成器根据使用情况确定一个最优的对齐。否则,指定没有这个论点的对齐要求。

  • 正整数是2的幂,不超过128——指定的字节数的边界。的起始数据分配内存地址函数参数是指定值的倍数。如果你指定一个对齐边界不到的自然调整参数数据类型,对齐指令发射在生成的代码。然而,目标编译器忽略了指令。

下面的代码指定了AlignmentBoundary为一个论点16字节。

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

等效边界对齐规范的代码替换工具对话框在这个图。

请注意

如果您的模型进口金宝appSimulink.Bus,金宝appSimulink.Parameter,或金宝appSimulink.Signal对象,在对象属性指定一个对齐边界,使用对齐财产。有关更多信息,请参见金宝appSimulink.Bus,金宝appSimulink.Parameter,金宝appSimulink.Signal

为编译器提供数据校准规范

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

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

  • 如果你定义一个代码替换库登记进入rtwTargetInfo.m定制文件,添加一个或多个AlignmentSpecification对象一个RTW.DataAlignment对象。附加RTW.DataAlignment对象的TargetCharacteristics对象的注册表项。

    RTW.DataAlignment对象也有房产DefaultMallocAlignment指定默认的对齐边界,在字节,编译器使用动态分配的内存。如果代码生成器使用动态内存分配数据对象参与代码替换,该值确定是否更换的内存满足一致性要求。如果不是这样,代码生成器不使用替代。的默认值DefaultMallocAlignment1,表明动态分配的内存使用的默认对齐边界是未知的。在这种情况下,代码生成器使用的自然对齐数据类型来决定是否允许一个替换。

    此外,您可以指定对齐边界复杂类型使用addComplexTypeAlignment函数。

  • 如果你使用代码生成一个定制文件的函数替换工具,填写以下字段为每个编译器。

    单击加号(+)符号添加额外的编译器规格。

为每个数据校准规范,提供以下信息。

AlignmentSpecification财产

对话框参数

描述

AlignmentType

对齐类型

单元阵列预定义的枚举字符串,指定类型的对齐这个规范支持。金宝app

  • DATA_ALIGNMENT_LOCAL_VAR——局部变量。

  • DATA_ALIGNMENT_GLOBAL_VAR全局变量。

  • DATA_ALIGNMENT_STRUCT_FIELD——个人结构字段。

  • DATA_ALIGNMENT_WHOLE_STRUCT——整体结构,填充(个体结构对齐,如果指定,是支持和优先于整个结构对齐)。

必须指定至少每个校准规范DATA_ALIGNMENT_GLOBAL_VARDATA_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支持的语言

单元阵列指定此校准规范适用的语言中cc++。有时对齐语法和语言编译器之间的位置不同。

这是一个数据对齐规范GCC编译器:

da = RTW.DataAlignment;= RTW.AlignmentSpecification;作为。AlignmentType = {“DATA_ALIGNMENT_LOCAL_VAR”,“DATA_ALIGNMENT_STRUCT_FIELD”,“DATA_ALIGNMENT_GLOBAL_VAR”};作为。AlignmentSyntaxTemplate =“使用__attribute__((对齐(% n)))”;作为。AlignmentPosition =“DATA_ALIGNMENT_PREDIRECTIVE”;作为。金宝appSupportedLanguages = {“c”,“c++”};da.addAlignmentSpecification ();tc = RTW.TargetCharacteristics;tc。DataAlignment = da;

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

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

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

  1. 创建并保存以下代码替换表定义文件,crl_table_mmul_4x4_single_align.m。这个表定义了一个替换条目*(乘法)运营商数据类型,和输入维度(4,4)。入口还指定了数据的16字节边界对齐每个替代函数参数。入口表达了要求的起始数据分配内存地址函数参数在代码生成是16的倍数。

    函数hLib = crl_table_mmul_4x4_single_align% CRL_TABLE_MMUL_4x4_SINGLE_ALIGN—描述矩阵算子条目的数据对齐hLib = RTW.TflTable;输入= RTW.TflCOperationEntry;setTflCOperationEntryParameters(条目,“关键”,“RTW_OP_MUL”,“优先”,90,“ImplementationName”,“matrix_mul_4x4_s”);%概念参数createAndAddConceptualArg(条目,“RTW.TflArgMatrix”,“名字”,“日元”,“IOType”,“RTW_IO_OUTPUT”,“基类型”,“单一”,“DimRange”4 [4]);createAndAddConceptualArg(条目,“RTW.TflArgMatrix”,“名字”,‘u1’,“基类型”,“单一”,“DimRange”4 [4]);createAndAddConceptualArg(条目,“RTW.TflArgMatrix”,“名字”,“u2”,“基类型”,“单一”,“DimRange”4 [4]);%实现参数arg = getTflArgFromString (hLib,“日元”,“空白”);参数。IOType =“RTW_IO_OUTPUT”;entry.Implementation.setReturn (arg);arg = getTflArgFromString (hLib,“日元”,“单*”);参数。IOType =“RTW_IO_OUTPUT”;desc = RTW.ArgumentDescriptor;desc.AlignmentBoundary = 16;参数。描述符= desc;entry.Implementation.addArgument (arg);arg = getTflArgFromString (hLib,‘u1’,“单*”);desc = RTW.ArgumentDescriptor;desc.AlignmentBoundary = 16;参数。描述符= desc;entry.Implementation.addArgument (arg);arg = getTflArgFromString (hLib,“u2”,“单*”);desc = RTW.ArgumentDescriptor;desc.AlignmentBoundary = 16;参数。描述符= desc;entry.Implementation.addArgument (arg);hLib.addEntry(入口);
  2. 创建并保存以下注册文件,rtwTargetInfo.m。如果你想编译生成的代码在这个例子中,第一次修改AlignmentSyntaxTemplate编译器使用的财产。例如,MSVC的编译器,更换gcc模板规范__attribute__((对齐(% n)))使用__declspec(对齐(% n))

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

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

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

  6. 审查代码替换。例如,检查是否一个乘法操作取代matrix_mul_4x4_s函数调用。在mmalign.h,检查gcc是否对齐指令__attribute__((对齐(16)))使生成的函数变量。

相关的话题