主要内容

升级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.,键入:

    mex mymexfile.c.

  4. 解决故障和警告 - 请参阅解决-largearraydims构建故障和警告

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

  6. 检查内存 - 查看大阵列实验

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

备份文件并创建测试

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

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

更新变量

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

更新用于调用64位API中的函数的参数

的64位API函数mwSize/mwIndex类型。有关函数列表,请参见使用64位API.搜索用于调用函数的变量。检查功能签名,显示在下语法函数参考文档中的标题。该签名标识接受的变量mwSize/mwIndex值作为输入或输出值。更改变量以使用正确的类型。

例如,假设您的代码使用mxCreateDoubleMatrix函数,如下所示:

int nrows ncolumns;... y_out = mxcreatedoublematrix(nrows,ncolumns,mxreal);

要查看函数签名,请键入:

doc mxcreatedoublematrix.

的签名是:

mxarray * mxcreatedoublematrix(mwsize m,mwsize n,mx互补性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(类型),计算价值ncolumns.如果复制64位值nrows变成32位变量,numDataPoints,结果值截断。您的MEX文件可能会崩溃或产生不正确的结果。使用类型mwSizenumDataPoints,如下表所示。

替换: :
int numDataPoints;
mwSize numDataPoints;

分析其他变量

您无需在代码中更改每个整数变量。例如,结构和状态代码中的字段编号是类型的.但是,您需要识别用于多种目的使用的变量,并且如有必要,请用多个变量替换它们。

以下示例创建一个矩阵,mynumeric.,和结构,mystruct.,基于传感器的数量。代码使用一个变量,numsensors.,对于数组的大小和结构中的字段数。

mxarray * mynumeric,* mystruct;int numsensors;mwsize m,n;char **野外名;... mynumeric = mxcreatedoublematrix(numsensors,n,mxreal);mystruct = mxcreateStructmatrix(m,n,numsensors,fieldnames);

的函数签名mxCreateDoubleMatrixmxCreateStructMatrix是:

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.要同时处理这两个功能,请替换numsensors.有两个新变量,如下表所示。

替换: :
int numsensors;
/*创建2个变量*/ /*不同类型的变量*/ mwSize numSensorSize;int numSensorFields;
myNumeric = mxCreateDoubleMatrix(numSensors, n, mxREAL);
/ *使用mwsize变量* / / * numsensize * / mynumeric = mxcreatedoublematrix(numsensize,n,mxreal);
myStruct = mxCreateStructMatrix(m, n, numSensors, fieldnames);
/ *使用int变量* / / * numsensorfields * / mystruct = mxcreatestructmatrix(m,n,numsensorfields,fieldnames);

每次重构迭代后测试,调试和解决差异

建造mymexfile.c.使用32位API,类型:

墨西哥人-compatibleArrayDims myMexFile.c

使用在此过程开始时创建的测试来比较更新后的MEX文件与原始二进制文件的结果。两个MEX文件应该返回相同的结果。如果不是,调试并解决任何差异。与使用64位API构建时相比,现在更容易解决差异。

决心-largeArrayDims构建失败和警告

查看和更新​​代码后,使用大型数组处理API编译MEX文件。建造mymexfile.c.使用64位API,键入:

mex mymexfile.c.

自从此以来mwSize/mwIndex类型是matlab.®类型,编译器有时称它们为size_t.unsigned_int64.,或其他类似的名称。

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

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

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

要识别问题和可能的解决方案 - 您可能会在运行MEX文件时遇到,金宝搏官方网站请参阅步骤6我如何更新mex文件使用大数组处理API (- largearraydimms)?

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

大阵列实验

如果您可以访问具有大量内存量的机器,则可以使用大型数组进行实验。一系列双精度浮点号(Matlab中的默认值),232元素大约需要32 GB的内存。

有关演示大数组使用的示例,请参阅arraysize.c墨西哥人文件在C MEX文件中处理大型mxArrays

相关的例子

更多关于

外部网站