CUDA-Matlab 编译中C++指针的问题

Problems with C++ Pointers in CUDA-Matlab compilation

本文关键字:问题 指针 C++ 编译 CUDA-Matlab      更新时间:2023-10-16

嘿,我有以下代码片段:

double *f;
f = a_function(parameters...); 
printf("%f", *(f+1));
loopAry(f, 5);
void loopAry(double *in, int size)
{   
    printf("%fn", *(in+1));
    for(int i = 0; i < size; i++) 
    {
        printf("nin[%d]=%f  ", i, *(in+i));
    }
}

(MATLAB 中的 MEX 文件)。现在的问题是:在如何编译带有 CUDA 的 mex 文件之前,我已经找到了两种解决方案,我发现当我使用第一种方法编译它时,上面的代码可以正常工作,如果我使用第二种方法编译它,代码就是不运行。现在我想知道,如果代码包含任何可疑的东西,最终会导致一些问题?

方法一执行输出(这是正确的行为):

1.000000  1.000000
in[0]=1.000000  
in[1]=1.000000  
in[2]=1.000000  
in[3]=1.000000  
in[4]=1.000000  

第二个执行以下操作:

1.000000 0.000000
in[0]=0.000000  
in[1]=90932971983710041000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000  
in[2]=90932971983710041000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000  
in[3]=90932971983710041000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000  
in[4]=90932971983710041000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000  

所以通过指针传递数据有问题,因为第二个元素(printf("%f", *(fVec0_+1));)的输出按预期工作......但不是在打电话给loopArray()之后...

为了明确两种编译方法:第一(工作)执行此脚本:http://www-europe.mathworks.com/matlabcentral/fileexchange/25314-cuda-mex 它使一个新的 m 文件像通常的 mex 脚本一样编译(仅包含 CUDA):-)

第二个(不工作)(在 http://forums.nvidia.com/index.php?showtopic=172175 上找到)

function nvc(filename)
options='-arch=sm_21';
options=[options ' --use_fast_math'];
txt=sprintf('"C:\Program Files (x86)\NVIDIA GPU Computing Toolkit\CUDA\v3.2\bin\nvcc" %s.cu %s -c -lcufft -lcudart -lcublas -lcuda --ptxas-options=-v -IJ:\MATLAB32bitR2010b\extern\include',filename,options);
system(txt)
mex_options='-O'; % enable optimisation
n=getenv('CUDA_LIB_PATH');
mex(['-L' n],mex_options,'-lcudart','-lcufft','-lcublas','-lcuda',sprintf('%s.obj',filename));
delete(sprintf('%s.obj',filename));

编辑这是返回指针的函数:

double *a_function(const mxArray *point)
{
    double *dat = mxGetPr(point);   
    double vals[ 5 ] = {
dat[0]*dat[0]*dat[0],
dat[1]*dat[1]*dat[1],
dat[2]*dat[2]*dat[2],
dat[3]*dat[3]*dat[3],
dat[4]*dat[4]*dat[4]};
    double *pnt = vals;
    return pnt;
}

将数组声明为局部变量,该变量将在函数结束时超出范围。f指针指向数组曾经存在但不再是的位置。

您应该动态分配数组:

double *vals = new double[5];
vals[0] = dat[0]*dat[0]*dat[0];
vals[1] = dat[1]*dat[1]*dat[1];
// ... 
// Or use a for-loop for the initialization:
for (int i=0; i<5; i++)
   vals[i] = dat[i]*dat[i]*dat[i];

完成阵列后,再次将其删除:

delete[] f;
函数

a_function返回在其堆栈上分配的数组。一旦a_function返回,数组就无效。在某些情况下 - 编译器标志会影响这一点 - 数组看起来部分或全部可用,但严格来说它是垃圾。如果需要从函数返回指向数组的指针,则必须使用 new 分配数组。