在我的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中有一个命令允许将数据从可分页内存快速复制到固定内存?
先谢了,莫因。
1条答案
按热度按时间hmae6n7t1#
您确实可以使用
cudaHostAlloc
分配固定内存,但是如果您已经分配了内存,您可以使用cudaHostRegister
来固定它,cudaHostRegister
获取一个已经分配的主机数组指针(在您的示例中,从mxGetPr
获取)。请注意,这将花费时间来固定内存,但可能比执行
cudaHostAlloc
然后复制它要少。