我正在使用4个GPU并加快内存传输我正在尝试使用cudaHostAlloc()来固定内存。
主UI线程(mfc base)创建4个线程,每个线程调用cudaSetDevice(nDeviceID)。
这是我的问题。我可以在主线程上调用cudaHostAlloc()并将指针指定为lParam,或者在调用cudaSetDevice(nDeviceID)之后我必须在每个分支线程中调用它吗?
这是伪代码。
1)在主线程上调用cudaHostAlloc
主线程
cudaHostAlloc((void**)h_arrfBuf, size*sizeof(float), cudaHostAllocDefault);
AcqBuf(h_arrfBuf, size);
for i =1:4
ST_Param* pstParam = new ST_Param(i, size/4, h_arrfBuf);
AfxBeginThread(Calc, pstParam );
分支线程
UINT Calc(LPVOID lParam)
ST_Param pstParam = reinterpret_cast<ST_Param*>(lParam);
cudaSetDevice(pstParam->nDeviceID);
Cudafunc(pstParam->size/4, pstParam->h_arrfBuf+(pstParam->nDeviceID-1)*size/4);
2)在分支线程上调用cudaHostAlloc
主线程
AcqBuf(arrfRaw, size);
for i =1:4
ST_Param* pstParam = new ST_Param(i, size/4, arrfRaw + (i-1)*size/4);
AfxBeginThread(Calc, pstParam);
分支线程
UINT Calc(LPVOID lParam)
ST_Param pstParam = reinterpret_cast<ST_Param*>(lParam);
cudaSetDevice(pstParam->nDeviceID);
cudaHostAlloc((void**)h_arrfBuf, size/4*sizeof(float), cudaHostAllocDefault);
memcpy(h_arrfBuf, pstParam->arrfRaw, size/4*sizeof(float));
Cudafunc(pstParam->size/4, h_arrfBuf);
我基本上很好奇的是固定内存是否与设备有关。
答案 0 :(得分:3)
从CUDA 4.0开始,运行时API本质上是线程安全的,并且任何给定GPU上的上下文在给定应用程序中的每个主机线程之间自动共享(参见here)。
此外,引用相关的documentation:
当应用程序作为64位进程运行时,单个地址空间用于主机和计算能力2.0及更高版本的所有设备。通过CUDA API调用进行的所有主机内存分配以及受支持设备上的所有设备内存分配都在此虚拟地址范围内。结果:
...
cudaHostAlloc()
分配可自动移植(请参阅 便携式内存)跨所有设备的统一地址 使用了空格,可以使用cudaHostAlloc()
返回的指针 直接来自在这些设备上运行的内核(即,存在 无需通过cudaHostGetDevicePointer()
获取设备指针 在Mapped Memory中描述。
因此如果您的GPU和平台支持统一虚拟寻址,则固定/映射主机内存可自动移植到该地址空间内的所有设备,并且每个GPU上下文可自动移植到每个主机线程。因此,鉴于上述所有限制,您应该安全地从单个主机线程进行完整的固定内存设置。