主要内容

将MEX文件升级为使用64位API

墨西哥人命令使用-largeArrayDims选项。本节介绍如何升级您的MEX文件以使用64位API。

方法,可以继续使用32位API墨西哥人命令使用-compatibleArrayDims选择。不过,有关使用此选项的详细信息,请参见如果我不升级怎么办?

要检查和更新MEX文件源代码,请使用以下检查表。

  1. 在编辑前准备代码-请参阅备份文件并创建测试

  2. 迭代地修改和测试代码。

    在使用64位API构建MEX文件之前,使用更新变量对于Fortran,升级Fortran MEX文件以使用64位API

    在每次更改之后,构建并测试代码:

  3. 使用64位API编译。构建myMexFile.c类型:

    墨西哥人myMexFile.c

  4. 解决故障和警告-请参阅Resolve -largeArrayDims构建失败和警告

  5. 比较结果-参见执行64位MEX文件,并将结果与32位版本进行比较

  6. 检查内存-参见大型阵列实验

下面的过程使用C/ c++术语和示例代码。Fortran MEX文件共享问题,中描述的更多任务升级Fortran MEX文件以使用64位API

备份文件并创建测试

在修改代码之前,请验证MEX文件是否适用于32位API。至少,构建一个预期输入和输出的列表,或者创建一个完整的测试套件。使用这些测试将结果与更新后的源代码进行比较。结果应该是相同的。

备份所有源文件、二进制文件和测试文件。

更新变量

若要处理大型数组,请将包含数组索引或大小的变量转换为mwSize而且mwIndex类型,而不是32位int类型。检查你的代码,看看它是否包含以下类型的变量:

更新用于调用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)

输入参数的类型而且nmwSize.如表中所示更改代码。

替换: :
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文件可能崩溃或产生不正确的结果。使用类型mwSizenumDataPoints,如下表所示。

替换: :
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.的类型nfieldsint.要处理两个函数,请替换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_tunsigned_int64,或其他类似的名称。

大多数构建问题都与32位和64位类型之间的类型不匹配有关。参见步骤5我如何更新墨西哥文件使用大数组处理API (-largeArrayDims)?识别特定编译器的常见构建问题,以及可能的解决方案。金宝搏官方网站

执行64位MEX文件,并将结果与32位版本进行比较

将运行用64位API编译的MEX文件的结果与原始二进制文件的结果进行比较。如果存在任何差异或失败,请使用调试器来调查原因。有关调试器功能的信息,请参阅编译器文档。

要确定运行MEX文件时可能遇到的问题和可能的解决方案,请参阅中的金宝搏官方网站步骤6我如何更新墨西哥文件使用大数组处理API (-largeArrayDims)?

在您解决问题并升级MEX文件后,它将在使用大型数组处理API的同时复制原始代码的功能。

大型阵列实验

如果您可以访问具有大量内存的机器,则可以尝试使用大型数组。带有2的双精度浮点数数组(MATLAB中的默认值)32元素占用大约32gb内存。

有关演示大型数组使用的示例,请参见arraySize.cMEX文件在C MEX文件中处理大型mxArrays

相关的例子

更多关于

外部网站