如何高效地将变量从Matlab异步传递到GPU?

t5zmwmid  于 2023-01-17  发布在  Matlab
关注(0)|答案(1)|浏览(155)

在我的CUDA项目中,我可以定义一个固定内存,将数据从.txt文件复制到固定内存,并在内核中执行处理时使用流将数据复制到GPU。现在,我想创建一个CUDA MEX文件,然后传递数据(称为RfData)变量。但是,我注意到无法直接将来自MATLAB的数组分配为固定CUDA内存,我必须使用可分页内存:

int* RfData;
    RfData = (int *)mxGetPr(prhs[0]); 
    int* Device_RfData;  
    int ArrayByteSize_RfData = sizeof(int) * (96* 96* 2048);
    cudaMalloc((int**)&Device_RfData, ArrayByteSize_RfData);
    cudaMemcpy(Device_RfData, RfData, ArrayByteSize_RfData, cudaMemcpyHostToDevice);

我需要使用流来复制RfData async。我知道的唯一方法是将RfData复制到固定内存,然后使用流:

int* RfData_Pinned;
    cudaHostAlloc((void**)&RfData_Pinned, ArrayByteSize_RfData,  cudaHostAllocWriteCombined);
    for (int j = 0; j < (96* 96* 2048); j++)
    {
        RfData_Pinned[j] = RfData[j];
    }

但是,它增加了我的MEX函数的整体处理时间。
我如何以异步方式将数据从Matlab传输到GPU?也许CUDA中有一个命令允许将数据从可分页内存快速复制到固定内存?
先谢了,莫因。

hmae6n7t

hmae6n7t1#

您确实可以使用cudaHostAlloc分配固定内存,但是如果您已经分配了内存,您可以使用cudaHostRegister来固定它,cudaHostRegister获取一个已经分配的主机数组指针(在您的示例中,从mxGetPr获取)。
请注意,这将花费时间来固定内存,但可能比执行cudaHostAlloc然后复制它要少。

相关问题