行-主数组布局代码设计
代码生成之外,MATLAB®默认情况下使用列主布局。数组布局规范不影响自包含的MATLAB代码。以测试所生成代码或您的MATLAB函数块,使用行主布局和列主布局创建单独的版本。然后,比较他们的表现。
您可以设计MATLAB代码以避免与数组布局相关的潜在低效率。低效率可能由以下原因引起:
行主布局和列主布局之间的转换。
行主数据的一维或线性索引。
对行主数据进行重塑或重新排列。
当您在相同的代码或模型中混合行主和列主规范时,或者当您对存储在行主中的数据使用线性索引时,数组布局转换是必要的。当您模拟一个模型或为一个模型生成代码时,该模型使用column-major,并且包含MATLAB函数块,然后软件根据需要将输入数据转换为行主数据,并将输出数据转换回列主数据,反之亦然。
低效率可能是由于函数或算法没有针对给定的数组布局选择进行优化造成的。如果某个函数或算法对于不同的布局更有效,则可以通过将其嵌入到另一个函数中来加强该布局coder.rowMajor
或coder.columnMajor
调用。
了解数组布局可能导致的低效率
考虑以下代码myMixedFn2
,使用coder.ceval
以行为主和列为主的布局传递数据:
函数[B, C] = myMixedFn2(x,y)% # codegen指定ceval调用的返回参数类型A = 0(大小(x));B = 0(大小(x));C = 0(大小(x));包括使用行主键和列主键的外部C函数coder.cinclude (“addMatrixRM.h”);coder.updateBuildInfo (“addSourceFiles”,“addMatrixRM.c”);coder.cinclude (“addMatrixCM.h”);coder.updateBuildInfo (“addSourceFiles”,“addMatrixCM.c”);调用使用主列顺序的C函数coder.ceval (“布局:columnMajor”,“addMatrixCM”,...coder.rref (x) coder.rref (y), coder.wref (A));%计算B为i = 1: B(i) = A(i) + 7;结束调用使用行为主序的C函数coder.ceval (“布局:rowMajor”,“addMatrixRM”,...coder.rref (y), coder.rref (B), coder.wref (C));结束
外部文件包括:
声明配置对象,cfg
.类生成使用行主布局的代码-rowmajor
选择。
CFG = code .config(“自由”);cfg。HighlightPotentialRowMajorIssues = true;codegenmyMixedFn2arg游戏{的(20、10)的(20、10)}配置cfg-launchreport-rowmajor
突出显示的问题显示在代码生成报告中代码的见解选项卡,在潜在的排主要问题部分。
数组布局效率低的原因如下:
代码生成器必须转换输入变量
x
而且y
到列主布局,然后将它们传递给addMatrixCM
.必须在生成的代码中插入转置。代码生成器必须转置输出变量
一个
回到行为主布局,因为myMixedFn2
使用行主布局。for循环使用线性索引,这需要主列数据。代码生成器必须重新计算线性索引,因为变量
一个
而且B
存储在主行中。
线性索引使用列主数组布局
代码生成器遵循MATLAB列主语义进行线性索引。有关MATLAB中线性索引的更多信息,请参见数组索引.
要对行主数据使用线性索引,代码生成器必须首先重新计算列主布局中的数据表示。这种额外的处理可能会降低性能。要提高代码效率,请避免对行主数据使用线性索引,或对使用线性索引的代码使用列主布局。
例如,考虑函数sumShifted下载188bet金宝搏Products
,它接受一个矩阵作为输入并输出一个标量值。该函数在输入矩阵上使用线性索引,对每个矩阵元素与相邻元素的乘积求和。此操作的输出值取决于存储输入元素的顺序。
函数mySum = sumShifted下载188bet金宝搏Products(A)% # codegenmySum = 0;%创建A元素的线性向量B = a (:);%乘以B乘以B,元素移位1,然后求和mySum = sum(B *circshift(B,1));结束
为MATLAB编码器™,以生成使用行为主布局的代码,输入:
codegen配置:墨西哥人sumShifted下载188bet金宝搏Productsarg游戏{1(2、3)}-launchreport-rowmajor
对于一个输入示例,考虑矩阵:
D =重塑(1:6,3,2)'
收益率:
D = 1 2 3 4 5 6
如果将此矩阵作为输入传递给生成的代码,则一个
按以下顺序存储:
1 2 3 4 5 6
相反,因为向量B
是通过线性索引获得的,其存储顺序为:
1 4 2 5 3 6
代码生成器必须插入一个重塑操作,以重新排列来自行的主布局的数据一个
为列-主布局B
.这个额外的操作降低了行为主布局函数的效率。这种效率随着数组的大小而增加。由于线性索引总是使用列主布局,因此生成的代码用于sumShifted下载188bet金宝搏Products
产生相同的输出结果,无论是用行主布局还是列主布局生成。
通常,计算索引或下标的函数也使用线性索引,并生成与存储在列主布局中的数据相对应的结果。这些功能包括:
另请参阅
coder.ceval
|coder.columnMajor
|coder.rowMajor
|coder.isRowMajor
|coder.isColumnMajor