mxGPU GetDimensions返回一个在维度大小之间用零填充的数组

时间:2014-04-16 16:33:25

标签: c matlab cuda mex

所以我将5乘6(主机)矩阵传递给我的mex函数。 (部分)我的代码:

const mxGPUArray* A;

A=mxGPUCreateFromMxArray(prhs[0]);
const mwSize* img_size =  mxGPUGetDimensions(A);
const int M=img_size[0];
const int N=img_size[1];
const int O=img_size[2];
const int P=mxGPUGetNumberOfDimensions (A);

mexPrintf("\n %i %i %i %i \n",M,N,O,P);

我的输出是:
    5 0 6 2

如果我将P设为img_size [3]我得到0,img_size [0到3] = 5,0,6,0

即使维度数量依据:

mxGPUGetNumberOfDimensions (A);

2

The documentation没有提及此事。为什么是这样? mwsize实际上与size_t不相同吗?它是指内存音调吗?我实际上是使用扁平4D阵列吗?

2 个答案:

答案 0 :(得分:1)

好的,所以我添加了

-largeArrayDims

切换,现在值正确,即

img_size[0]

img_size[1]

对应正确的值。

答案 1 :(得分:1)

我必须先说明我之前从不使用Matlab mex界面,但是......

显而易见的是,mxGPUGetDimensions返回的内容与代码用于mwSize的内容之间的大小不匹配。如果返回值是64位整数(例如64位平台上的size_t)而不是32位,则得到[5,0,6,0]的结果实际为[5,6]。 mwSize的{​​{3}}说明如下:

  

默认情况下,mwSize相当于C中的int。使用mex时   -largeArrayDims开关,mwSize等于C中的size_t。

因为我对Matlab一无所知,所以我不能告诉你如何解决这个问题(a)确保你的编译器/工具链正在构建64位代码,并且(b)尝试使用{{1}选项。

如果这些都不起作用,我建议您联系Mathworks支持。在构建环境或Matlab本身中,某些东西显然已被破坏。