我正在使用4个GPU,为了加快内存传输速度,我尝试使用cudaHostAlloc()来使用固定内存。
主UI线程(Mfc)创建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);我主要好奇的是,固定内存是否是特定于设备的。
发布于 2017-07-20 08:15:30
自CUDA4.0以来,运行时API在本质上是线程安全的,并且在给定应用程序中的每个主机线程之间自动共享任何给定GPU上的上下文(请参见这里)。
此外,引用了相关的文档
当应用程序作为64位进程运行时,主机和计算能力2.0及更高版本的所有设备都使用一个地址空间。通过CUDA API调用进行的所有主机内存分配和支持的设备上的所有设备内存分配都在此虚拟地址范围内。因此: ……
cudaHostAlloc()进行的分配可以在使用统一地址空间的所有设备上自动移植(请参阅便携式内存),而cudaHostAlloc()返回的指针可以直接从运行在这些设备上的内核中使用(也就是说,不需要像映射内存中描述的那样通过cudaHostGetDevicePointer()获得设备指针。因此,如果您的GPU和平台支持统一的虚拟寻址,那么固定/映射的主机内存将自动移植到该地址空间内的所有设备,并且每个GPU上下文在每个主机线程之间自动可移植。因此,考虑到上面描述的所有约束,从单个主机线程执行完整的固定内存设置应该是安全的。
https://stackoverflow.com/questions/45203787
复制相似问题