Memory 在VisualStudio中编写的MexGateway代码中,是否可以将变量预分配给CPU/GPU内存?

Memory 在VisualStudio中编写的MexGateway代码中,是否可以将变量预分配给CPU/GPU内存?,memory,cuda,mex,Memory,Cuda,Mex,我试图编写一个MexGateway代码,将matlab中的两个变量传递到编译后的MexFile,将变量复制到cuda内核,进行处理并将结果返回到matlab。我需要在matlab的for循环中使用这个MexFile 问题在于:这两个输入对于我的应用程序来说是巨大的,并且在每个循环中只有一个(在下面的代码中称为Device_Data)在变化。因此,我正在寻找一种方法来预先分配稳定的输入,这样它就不会在for循环的每次迭代中从GPU中删除。我还需要说,我真的需要在我的VisualStudio代码中这

我试图编写一个MexGateway代码,将matlab中的两个变量传递到编译后的MexFile,将变量复制到cuda内核,进行处理并将结果返回到matlab。我需要在matlab的for循环中使用这个MexFile

问题在于:这两个输入对于我的应用程序来说是巨大的,并且在每个循环中只有一个(在下面的代码中称为Device_Data)在变化。因此,我正在寻找一种方法来预先分配稳定的输入,这样它就不会在for循环的每次迭代中从GPU中删除。我还需要说,我真的需要在我的VisualStudio代码中这样做,并在MexGateway代码中实现这一点(我不想在Matlab中这样做)。有什么解决办法吗

这是我的代码(我已经编译过了,它工作得很好):

#包括
#包括“设备启动参数.h”
#包括
#包括“cuda.h”
#包括
#包括
#包括“MexFunctions.cuh”
__全局无效添加(int*设备数据,int*设备介质,int N){
int TID=threadIdx.y*blockDim.x+threadIdx.x;
如果(TID(设备数据,设备介质x,N);
(cudaMemcpy(数据\新,设备\数据,阵列字节大小,cudaMemcpyDeviceToHost));
cudaDeviceReset();
}

是的,只要您有MATLAB的分布式计算工具箱/并行计算工具箱,这是可能的

工具箱允许在普通的MATLAB代码中有一个名为
gpuArrays
的东西,但它也有一个C接口,您可以在其中获取和设置这些MATLAB数组的GPU地址

您可以在此处找到文档:

例如,对于mex文件的第一个输入:

mxGPUArray const *dataHandler= mxGPUCreateFromMxArray(prhs[0]); // Can be CPU or GPU, will copy to GPU if its not already there
float  *  d_data = static_cast<float  *>( (float *)mxGPUGetDataReadOnly(dataHandler)); // get the pointer itself (assuming float data)
mxGPUArray常量*dataHandler=mxGPUCreateFromMxArray(prhs[0]);//可以是CPU或GPU,如果它不在那里,将复制到GPU
float*d_data=static_cast((float*)mxGPUGetDataReadOnly(dataHandler));//获取指针本身(假设浮点数据)

谢谢。因此,如果我理解正确,我需要使用您的代码,而不是“cudamaloc”和“cudaMemcpy”。在您的代码中,指针“d_data”将被放置在全局内存中,并可以传递给内核。是吗?@MoeinMozaffarzadeh是的,
mxgpucreatefromxarray
将对GPU执行malloc和memcpy操作(如果需要)
d_数据
不会放在全局内存中,它只是一个
float*
。对于您的应用程序,如果数据没有改变,最好是在MATLAB端用
my_data=gpuarray(my_data)
分配数据,这样malloc和memcpy就已经完成了。Ok。我刚刚尝试了“Device_MediumX=gpuArray(MediumX);”将MediumX传输到GPU,将MediumX传递到mex文件,但运行它时它崩溃了。在我的网关代码中,我使用设备_MediumX=(int*)mxGetPr(prhs[0]);并将“Device_MediumX”传递给内核。我在这里做错了什么吗?如果没有完整的代码和错误消息,很难判断。我知道,如果在Matlab中定义的“gpuArray(MediumX)”在MEX代码中被指定为“prhs[0]”,那么您提供的两行代码工作得很好。但是,Device_MediumX(这是非可变变量)是否保留在GPU内存中?我的意思是,在我运行MEXFunction的每个循环中,你的两行代码都在重复,如果我理解正确的话,它们正在对GPU执行malloc和memcpy。你能对此发表评论吗?
mxGPUArray const *dataHandler= mxGPUCreateFromMxArray(prhs[0]); // Can be CPU or GPU, will copy to GPU if its not already there
float  *  d_data = static_cast<float  *>( (float *)mxGPUGetDataReadOnly(dataHandler)); // get the pointer itself (assuming float data)