如何更新MEX文件以使用大型数组处理API(-largeArraydims)?

133意见(最近30天)
MEX API已更改为支持具有超过2 ^ 32-1元素金宝app的MATLAB变量。在MATLAB 7.3版(R2006B)中添加了此功能。您必须使用-largeArrayDims标志编译MEX文件以将其选择替换为此API。
您可能需要更新MEX源代码以利用新API。在不久的将来,MEX构建脚本将默认使用大阵列处理API。

接受答案

Mathworks支金宝app持团队
Mathworks支金宝app持团队 于2020年2月27日
编辑:Mathworks支金宝app持团队 于2020年2月27日
添加大数组处理API可能需要您更新mex文件。需要更改代码的原因是,为了启用大型数据,必须更改MATLAB API的输入和输出类型。我们以减少对现有用户影响的方式实现了对API的更改。我们采用了“选择加入”策略,如果你想利用新的大型数组处理特性,你可以使用MEX标志“- largearraydimms”来选择加入。如果您选择选择加入,则需要进行本解决方案中描述的更新。如果你选择不“opt-in”,你现在不需要做任何事情。但是要注意,在未来,新的大型数组处理API将成为默认值,然后您将需要更新代码或采取其他操作。
此解决方案通过逐步的过程来识别您需要进行的更改。该程序表明您首先识别和列出候选人的变量,以便在修改代码之前更改候选程序。我们建议您在完成识别步骤之前,您不会编辑代码。
首先,考虑高级技术解释,了解需要进行的更改。随着MEX API使用的类型的变化,您的现有代码会将输入和输出传递给MATLAB,错误的类型是有可能的。具体地,改变的参数类型是指数和大小。两者都从32位类型更改为64位兼容类型。
以下过程将帮助您识别需要纠正的类型不匹配。它遵循一个系统的过程,包括首先测试原始代码,然后识别更改,然后更新代码的副本,构建新代码,最后重新测试。关于如何处理公共代码模式、构建失败和警告以及运行时问题,一路上都有一些建议。
注意:本文档主要使用C / C ++术语和示例代码。fortran mex-files共享相同的问题;您可以在第8.8节中找到其他fortran细节。
更详细地:
1.测试现有代码
在调整代码以处理大型数组之前,请先验证它是否适用于传统的32位阵列尺寸。您可能想要构建预期的输入和输出列表,甚至是完整的测试套件。备份您的源代码和一副保管,以便您可以将结果与更新的源代码进行比较。
2.识别包含64位索引或大小值的变量
为了处理非常大的数组,您需要转换包含数组指标或大小的所有变量,以使用MWSIZE / MWindex数据类型而不是32位“int”。当在64位体系结构上使用大型数组维度时,这些数据类型是64位整数,并实现为预处理器宏。使用-largeArraydim时,这两种类型都与C / C ++中的Size_t类型相同。
我们建议查看三类变量:直接由API函数,中间变量和用于尺寸/索引和32位整数的变量使用的那些。
2.1。搜索64位API函数直接使用的变量
要识别这些变量,请查找将MWSIZE / MWINDEX值作为输入或输出值的MX *和MEX *函数。
有关准确列表,请检查MATLAB版本中的文档。您可以在此找到此列表:
您可以使用编辑器的查找功能或Grep等实用程序找到这些功能。
例如,在较早版本的MATLAB (R2006a及更早版本)中,该签名为:
mxArray* mxcreatedoublematrix(int m,int n,mx互补性复合物);
MXCreateDouBlematrix在大阵列维度API中的签名是:
mxArray*mxCreateDoubleMatrix(mwSize m, mwSize n, mxComplexity ComplexFlag);
注意前两个输入参数已从“int”更改为“mwsize”。作为第一个或第二个输入传递的变量必须声明为mwsize。
您可以通过帮助浏览器或DOC命令找到每个函数的参考页面上的新签名:
博文mxcreatedoublematrix.
由于MWSIZE在使用32位阵列尺寸时与“int”相同,因此您的代码仍可能写入此旧签名。为了利用大型数组处理,您必须更新代码以使用MWSIZE / MWINDEX允许64位大小和索引值。
搜索代码,并注意任何定义为“int”或类似类型的变量。请勿在此时进行任何编辑,只需注意哪些变量需要更新。
如果您的代码是:
intm,n;
......
yp_out = mxcreatedoublematrix(m,n,mxreal);
M和N都应声明MWSIZE:
MWSIZE.m,n;
......
yp_out = mxcreatedoublematrix(m,n,mxreal);
2.2。找到中间变量
您的代码可能使用中间变量来计算大小和索引。如果是这种情况,则需要确保这些变量也被声明为适当的类型。考虑这个例子:
MWSIZE.m,n;
intnumdatapoints.;
m = 3;
numdatapoints = m * 2;
n = numdatapoints + 1;
......
yp_out = mxcreatedoublematrix(m,n,mxreal);
第2.1节中的第一个搜索将错过未直接用于MX *函数调用的中间变量,例如NumDataPoints。这些变量不足以处理来自MWSize变量的64位指数。将64位索引存储在这些32位中间变量中将截断索取,导致结果或崩溃不正确。在此示例中,应将NumDataPoint更改为MWSIZE,因为“M”是MWSIZE:
MWSIZE.m,n;
MWSIZE.numdatapoints.;
检查代码,并将所有此类中介添加到要转换的变量列表中。
同样,在这一点上不要做任何编辑。
2.3.替换具有多种用途的变量
您的代码可能对两个索引(我们转换为64位)以及STRACH字段编号或状态代码(其中一个停留32位)使用相同的变量。
需要识别用于多种目的的变量,并用两个变量替换---一个mwsize / mwindex和一个32位整数。在使用阵列大小和结构字段的数量时,使用一个变量时,这种情况特别是常见的。另一个案例是状态代码/成功标志也用作索引。
例如,mxCreateDoubleMatrix需要mwSize输入,但mxCreateStructMatrix需要int:
mxArray*mxCreateDoubleMatrix(mwSize m, mwSize n, mxComplexity ComplexFlag);
mxArray* mxcreatestructmatrix(mwsize m,mwsize n,int nfields,const char ** fieldnames);
现在考虑NumDataPoints变量:
mxArray* mynumeric.,* mystruct;
intnumsensors.;
MWSIZE.m,n;
char**野外名称;
intNumfields.;
......
mynumeric = mxcreatedoublematrix(numsensors,n,mxreal);
mystruct = mxcreateStructmatrix(m,n,numsensors,fieldnames);
在此示例中,您需要两个新的变量来替换NumSensors以正确处理两个功能:
mxArray* mynumeric.,* mystruct;
MWSIZE.numsensosize;
intnumsensorfields.;
MWSIZE.m,n;
char**野外名称;
......
mynumeric = mxcreatedoublematrix(numsensize,n,mxreal);
mystruct = mxcreatestructmatrix(m,n,numsensorfields,fieldnames);
注意需要以这种方式更换哪些变量。同样,在这一点上不要做任何编辑。
3.第三方图书馆
您的MEX文件可能涉及您没有写入的代码部分,以及您无权访问的部分。这些可以是整个MEX文件,数字例程或设备驱动程序。有几种方法可以接近这个问题:
3.1。如果您无法访问源代码,请联系供应商。将它们引用到此文档并讨论选项以处理大型数组尺寸。
3.2.如果您与他人共享代码,例如公开可用的源代码,请与相关作者或用户组联系,查看是否有人将代码转换为使用大数组维数。如果没有,您可能希望自己转换代码。同样,应用本文中的建议。
4.创建工作副本,进行编辑和使用32位维度测试。
此时,您知道需要编辑哪种类型的声明。制作源代码的副本并更改相关声明。像往常一样编译代码:
墨西哥人myMexFile.c
这使用传统的32位维度。这与使用-compatiblearraydims标志相同:
墨西哥人-compatiblearraydims mymexfile.c.
与原始二进制文件进行比较;两者都应该返回相同的结果。
如果没有,调试和解决任何差异。现在,这些将更容易地解决(使用相同的32位大小和指标)而不是下一步。
5.使用-largeArraydims构建并解决构建故障和警告。
您现在可以使用大型数组处理API编译MEX文件。只需将-largeArrayDims标志添加到您的编译;例如,而不是
墨西哥人myMexFile.c
使用
墨西哥人-largearraydims mymexfile.c.
使用-LargeArrayDim时,您的编译器可以将MWSIZE / MWINDEX称为“size_t”,“无符号 _ _int64“或其他类似的名称。
此时的大多数构建问题将与32位和64位类型之间的类型不匹配相关。您可能遇到的一些常见问题是:
5.1。在分配中键入不匹配
在某些情况下---特别简单的作业---您的C / C ++编译器可以警告类型不匹配。例如:
MWSIZE.m,n;
intnumdatapoints.;
......
numdatapoints = m * 2;
使用“mex -largearraydims buggymexfile.c”编译此文件时,您可能会收到类型不匹配警告。
在64位Windows上的Microsoft Visual Studio:错误:C:\ Work \ Buggymexfile.c(31):警告C4267:'=':从'size_t'转换为'int',可能的数据丢失
可以使用2.2节将中间变量numdatapots转换为mwSize来修复这个示例。
5.2。键入指针类型中的不匹配
使用MxCreate *数组函数,即占尺寸的阵列,您需要将指针从int *转换为mwsize *:
MWSIZE.NDIM;
int* myDims;
......
pa1 = mxcreatelogicalArray(ndim,mydims);
在64位Linux上gcc: ERROR: buggyMexFile.c: In function 'mexFunction': buggyMexFile.c:35: warning: pass argument 2 of 'mxCreateLogicalArray' From不兼容的指针类型
在这种情况下,mydim必须是mwSize*,如2.1节所述。
6.执行MEX文件,测试和调试
将使用-largeArrayDims编译的MEX文件的结果与原始二进制文件的结果进行比较。如果存在任何差异或失败,请使用调试器调查原因。
调试器是研究代码中的编程问题的关键工具。有关调试MEX文件的更多说明,请使用下面提供的链接:
有关调试器功能的更多信息,请参阅编译器文档。
在解决了- largearraydimms版本的任何问题之后,转换后的mex -文件现在可以在使用大型数组处理API的同时复制原始代码的功能。
以下是运行MEX文件时可能遇到的常见问题列表。
6.1。退出内存错误
您可能遇到的一个潜在错误模式是“内存不足”错误。这是将代码转换为使用大型数组维时最常见的故障模式之一。它通常是由分配内存的函数使用不匹配的类型引起的,例如mxCreateDoubleMatrix。类型不匹配破坏了请求的数组大小,导致MATLAB试图分配比您预期多得多的内存。这个值可能远远超过您正在使用的机器的可用内存(RAM)。
该函数需要8个字节,因此它获取与4字节变量传递进来的相邻的4个字节。额外的字节中包含随机信息,因此,该函数将输入解释为与传入的值非常不同的值。
例如,MXCreatedouBlematrix期望第一个参数是MWSIZE,在64位机器上使用-largeArraydims时,这是64位。假设随着第一个参数传递的变量是一个int,它是32位:
intm,n;
m = 10;
......
yp_out = mxcreatedoublematrix(m,n,mxreal);
mxcreateDoublematrix接收的值可以包含32位随机信息。例如,该值可以解释为85899345930(10 + 20 * 2 ^ 32)。这远远超过大多数机器的内存容量,因此Matlab报告退出内存错误:
???使用==> buggymexfile时出错
内存不足。为您的选项类型帮助内存。
如果遇到此问题,请将变量的类型更改为mwsize或mwindex,如第2.1节所建议的:
MWSIZE.m,n;
m = 10;
......
yp_out = mxcreatedoublematrix(m,n,mxreal);
这种情况难以调试,因为“M”和“N”都包含正确的值,但是是错误的存储类。您的调试器可以帮助识别此项。例如,Microsoft Visual Studio调试器显示一个“类型”列,该列将为上述变量显示“int”,以及“size_t”,“unsigned _ _int64“或正确类型的类似名称。
6.2。分割违规,断言或其他崩溃
使用调试器逐步通过原始和修改的代码,寻找两者之间的第一个区别,尤其是在您修改的任何变量中。在实际崩溃之前,这种根本原因可能会发生得好。
同样,您的调试器可以识别每个值的数据类型。
6.3。不同的结果
使用调试器逐步通过原始和修改的代码,寻找两者之间的第一个区别,尤其是在您修改的任何变量中。在将结果返回到Matlab之前,这种根本原因可能会很好。
7.用巨大的数组致电MEX-FILE
如果您可以访问具有大量内存的机器,您现在可以使用超过2 ^ 32-1元素的阵列进行实验。使用这些阵列需要大量的内存---一系列双精度浮点数(Matlab中的默认值),带有2 ^ 32元素,需要约32 GB的内存。
您可以在MEX文件中找到有关64位MXARRAYS的更多信息,以及演示使用大型数组的示例arraysize.c mex文件:
8.常见问题解答(在附加的Largearraydimsfaq.txt中回答):
8.1。如果我只使用32位matlab怎么办?
8.2。如果我已经在64位系统上进行了建议的更改以支持稀疏数组,那会怎样呢?金宝app
8.3。如果我已经提出了推荐的更改以支持64位MXArrays,该怎么办?金宝app
8.4。如果我已经为我的Fortran源文件提出了建议的更改,该怎么办?
8.5。如果我想选择退出怎么办(不想升级)?
8.6。如果我什么都不做了怎么办?
8.7。如果我没有源mex文件怎么办?
8.8。如果我正在使用fortran怎么办?
8.9。如果我在我的代码中找到umxputfull等弃用函数,该怎么办?

更多答案(0)

标签

没有输入标签。

下载188bet金宝搏


释放

r2008a.

社区宝藏狩猎

找到Matlab Central中的宝藏,并发现社区如何帮助您!

开始狩猎!

翻译