如何以异步方式有效地将变量从 Matlab 传递到 GPU?
How to efficiently pass a variable from Matlab to GPU in Asynchronous way?
在我的 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, ArrayByteSize_RfData, cudaHostAllocWriteCombined);
for (int j = 0; j < (96* 96* 2048); j++)
{
RfData_Pinned[j] = RfData[j];
}
但是,它增加了我的 MEX 函数的整体处理时间。
所以,现在的问题是:如何以异步方式将数据从 matlab 传输到 GPU?也许 CUDA 中有一个命令可以将数据从可分页内存快速复制到固定内存!!!?
提前致谢,
模因.
你确实可以用 cudaHostAlloc
分配固定内存,但如果你已经分配了内存,你可以改为只用 cudaHostRegister
固定它,它需要一个已经分配的主机数组指针(取自 mxGetPr
在你的情况下)。
请注意,固定内存需要时间,但可能比 cudaHostAlloc
然后复制要少。
在我的 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, ArrayByteSize_RfData, cudaHostAllocWriteCombined);
for (int j = 0; j < (96* 96* 2048); j++)
{
RfData_Pinned[j] = RfData[j];
}
但是,它增加了我的 MEX 函数的整体处理时间。
所以,现在的问题是:如何以异步方式将数据从 matlab 传输到 GPU?也许 CUDA 中有一个命令可以将数据从可分页内存快速复制到固定内存!!!?
提前致谢, 模因.
你确实可以用 cudaHostAlloc
分配固定内存,但如果你已经分配了内存,你可以改为只用 cudaHostRegister
固定它,它需要一个已经分配的主机数组指针(取自 mxGetPr
在你的情况下)。
请注意,固定内存需要时间,但可能比 cudaHostAlloc
然后复制要少。