将MEX文件升级为使用64位API
的墨西哥人
命令使用-largeArrayDims
选项。本节介绍如何升级您的MEX文件以使用64位API。
方法,可以继续使用32位API墨西哥人
命令使用-compatibleArrayDims
选择。不过,有关使用此选项的详细信息,请参见如果我不升级怎么办?.
要检查和更新MEX文件源代码,请使用以下检查表。
在编辑前准备代码-请参阅备份文件并创建测试.
迭代地修改和测试代码。
在使用64位API构建MEX文件之前,使用更新变量对于Fortran,升级Fortran MEX文件以使用64位API.
在每次更改之后,构建并测试代码:
使用32位API构建。例如,建造
myMexFile.c
类型:c . mex - compatibllearraydims mymexfile . mex
在每次重构后进行测试—参见在每次重构迭代之后测试、调试和解决差异.
使用64位API编译。构建
myMexFile.c
类型:墨西哥人myMexFile.c
解决故障和警告-请参阅Resolve -largeArrayDims构建失败和警告.
比较结果-参见执行64位MEX文件,并将结果与32位版本进行比较.
检查内存-参见大型阵列实验.
下面的过程使用C/ c++术语和示例代码。Fortran MEX文件共享问题,中描述的更多任务升级Fortran MEX文件以使用64位API.
备份文件并创建测试
在修改代码之前,请验证MEX文件是否适用于32位API。至少,构建一个预期输入和输出的列表,或者创建一个完整的测试套件。使用这些测试将结果与更新后的源代码进行比较。结果应该是相同的。
备份所有源文件、二进制文件和测试文件。
更新变量
若要处理大型数组,请将包含数组索引或大小的变量转换为mwSize
而且mwIndex
类型,而不是32位int
类型。检查你的代码,看看它是否包含以下类型的变量:
矩阵API函数直接使用的变量-参见更新用于调用64位API中的函数的参数.
中间变量-参见更新用于数组下标和大小的变量.
用作大小/索引值和32位整数的变量-参见分析其他变量.
更新用于调用64位API中的函数的参数
属性的64位API函数mwSize
/mwIndex
类型。有关函数列表,请参见使用64位API.搜索用于调用函数的变量。的下面显示的函数签名语法函数参考文档上的标题。签名标识所取的变量mwSize
/mwIndex
值作为输入值或输出值。更改变量以使用正确的类型。
例如,假设您的代码使用mxCreateDoubleMatrix
函数,如以下语句所示:
int nrows ncolumns;...y_out = mxCreateDoubleMatrix(nrows, ncolumns, mxREAL);
要查看函数签名,输入:
医生mxCreateDoubleMatrix
签名为:
mxArray *mxCreateDoubleMatrix(mwSize m, mwSize n, mxComplexity ComplexFlag)
输入参数的类型米
而且n
是mwSize
.如表中所示更改代码。
替换: | : |
---|---|
int nrows ncolumns; |
mwSize nrows ncolumns; |
更新用于数组下标和大小的变量
如果代码使用中间变量来计算大小和索引值,请使用mwSize
/mwIndex
对于这些变量。例如,以下代码将输入声明为mxCreateDoubleMatrix
类型mwSize
:
mwSize nrows ncolumns;/*输入mxCreateDoubleMatrix */ int numDataPoints;Nrows = 3;numDataPoints = nrows * 2;ncolumns = numDataPoints + 1;...y_out = mxCreateDoubleMatrix(nrows, ncolumns, mxREAL);
这个例子使用了中间变量,numDataPoints(类型的int
),以计算的值ncolumns.如果将64位值从nrows变成32位的变量,numDataPoints,则结果值截断。您的MEX文件可能崩溃或产生不正确的结果。使用类型mwSize
为numDataPoints,如下表所示。
替换: | : |
---|---|
int numDataPoints; |
mwSize numDataPoints; |
分析其他变量
您不需要更改代码中的每个整数变量。例如,结构和状态代码中的字段号是类型int
.但是,您需要识别用于多种目的的变量,并在必要时用多个变量替换它们。
下面的例子创建了一个矩阵,myNumeric,和结构,myStruct,根据传感器数量来确定。代码使用一个变量,numSensors,数组的大小和结构中字段的数量。
mxArray *myNumeric, *myStruct;int numSensors;m, n;char * *字段名;...myNumeric = mxCreateDoubleMatrix(numSensors, n, mxREAL);myStruct = mxCreateStructMatrix(m, n, numSensors, fieldnames);
的函数签名mxCreateDoubleMatrix
而且mxCreateStructMatrix
是:
mxArray *mxCreateDoubleMatrix(mwSize m, mwSize n, mxComplexity ComplexFlag) mxArray *mxCreateStructMatrix(mwSize m, mwSize n, int nfields, const char **fieldnames);
为mxCreateDoubleMatrix
函数,您的代码使用numSensors对于变量米.的类型米是mwSize
.为mxCreateStructMatrix
函数,您的代码使用numSensors对于变量nfields.的类型nfields是int
.要处理两个函数,请替换numSensors使用两个新变量,如下表所示。
替换: | : |
---|---|
int numSensors; |
/*创建2个不同类型的变量*/ /*int numSensorFields; |
myNumeric = mxCreateDoubleMatrix(numSensors, n, mxREAL); |
/*使用mwSize变量*/ /* numSensorSize */ myNumeric = mxCreateDoubleMatrix(numSensorSize, n, mxREAL); |
myStruct = mxCreateStructMatrix(m, n, numSensors, fieldnames); |
/*使用int变量*/ /* numSensorFields */ myStruct = mxCreateStructMatrix(m, n, numSensorFields, fieldnames); |
在每次重构迭代之后测试、调试和解决差异
构建myMexFile.c
使用32位API,输入:
c . mex - compatibllearraydims mymexfile . mex
使用在此过程开始时创建的测试将更新后的MEX文件的结果与原始二进制文件进行比较。两个MEX文件应该返回相同的结果。如果不是,调试并解决任何差异。与使用64位API构建时相比,现在更容易解决差异。
解决-largeArrayDims
构建失败和警告
在检查和更新代码之后,使用大数组处理API编译MEX文件。构建myMexFile.c
使用64位API,输入:
墨西哥人myMexFile.c
自mwSize
/mwIndex
类型是MATLAB®类型,你的编译器有时会把它们称为size_t
,unsigned_int64
,或其他类似的名称。
大多数构建问题都与32位和64位类型之间的类型不匹配有关。参见步骤5我如何更新墨西哥文件使用大数组处理API (-largeArrayDims)?识别特定编译器的常见构建问题,以及可能的解决方案。金宝搏官方网站
执行64位MEX文件,并将结果与32位版本进行比较
将运行用64位API编译的MEX文件的结果与原始二进制文件的结果进行比较。如果存在任何差异或失败,请使用调试器来调查原因。有关调试器功能的信息,请参阅编译器文档。
要确定运行MEX文件时可能遇到的问题和可能的解决方案,请参阅中的金宝搏官方网站步骤6我如何更新墨西哥文件使用大数组处理API (-largeArrayDims)?.
在您解决问题并升级MEX文件后,它将在使用大型数组处理API的同时复制原始代码的功能。
大型阵列实验
如果您可以访问具有大量内存的机器,则可以尝试使用大型数组。带有2的双精度浮点数数组(MATLAB中的默认值)32元素占用大约32gb内存。
有关演示大型数组使用的示例,请参见arraySize.c
MEX文件在C MEX文件中处理大型mxArrays.