如何解决如何以异步方式有效地将变量从 Matlab 传递到 GPU?
在我的 CUDA 项目中,我可以定义一个固定内存,将数据从 .txt 文件复制到固定内存,并使用流将数据复制到 GPU,同时在内核中进行处理。 现在,我想制作一个 CUDA MEX 文件并在 Matlab 中将我的数据(称为 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 与流同步很重要。我能想到的唯一方法是首先将我的 RfData 复制到固定内存,然后使用流式传输:
int* RfData_Pinned;
cudaHostAlloc((void**)&RfData_Pinned,cudaHostAllocWriteCombined);
for (int j = 0; j < (96* 96* 2048); j++)
{
RfData_Pinned[j] = RfData[j];
}
所以,现在的问题是:如何以异步方式将数据从 matlab 传输到 GPU?也许 CUDA 中有一个命令可以将数据从可分页内存快速复制到固定内存!!!?
提前致谢, 莫恩。
解决方法
你确实可以用 cudaHostAlloc
分配固定内存,但如果你已经分配了内存,你可以用 cudaHostRegister
来固定它,它需要一个已经分配的主机数组指针(取自 mxGetPr
}} 在你的情况下)。
请注意,这需要时间来固定内存,但可能比执行 cudaHostAlloc
然后复制它要少。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。