【发布时间】:2011-08-21 18:56:42
【问题描述】:
你好, 我有以下代码-sn-p:
double *f;
f = a_function(parameters...);
printf("%f", *(f+1));
loopAry(f, 5);
void loopAry(double *in, int size)
{
printf("%f\n", *(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));) 的输出按预期工作...但是在调用 @987654327 后 不是 @...
澄清两种编译方法: FIRST(工作中) 执行这个脚本:http://www-europe.mathworks.com/matlabcentral/fileexchange/25314-cuda-mex 生成一个新的 m 文件,像通常的 mex 脚本一样编译(只包括 CUDA):-)
SECOND(不工作) (发现于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;
}
【问题讨论】:
-
a_function如何创建它返回的数组? -
哦,谢谢你指点我,我现在就在第一篇文章中发布!
-
您是否收到任何 CUDA 错误?是否有任何设备代码开头?
-
目前我没有在这段代码中使用 CUDA;但我将编译器设置为与 CUDA 一起编译,因为我想尽快集成 CUDA :)