gpt4 book ai didi

multithreading - 多个 GPU 中的固定内存

转载 作者:行者123 更新时间:2023-12-04 06:50:06 24 4
gpt4 key购买 nike

我正在使用 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);

我主要好奇的是固定内存是否特定于设备。

最佳答案

自 CUDA 4.0 以来,运行时 API 本质上是线程安全的,任何给定 GPU 上的上下文都会在给定应用程序内的每个主机线程之间自动共享(参见 here)。

此外,引用自相关documentation :

When the application is run as a 64-bit process, a single address space is used for the host and all the devices of compute capability 2.0 and higher. All host memory allocations made via CUDA API calls and all device memory allocations on supported devices are within this virtual address range. As a consequence:

....

  • Allocations via cudaHostAlloc() are automatically portable (see Portable Memory) across all the devices for which the unified address space is used, and pointers returned by cudaHostAlloc() can be used directly from within kernels running on these devices (i.e., there is no need to obtain a device pointer via cudaHostGetDevicePointer() as described in Mapped Memory.

所以如果您的 GPU 和平台支持统一虚拟寻址,那么固定/映射的主机内存会自动移植到该地址空间内的所有设备,并且每个 GPU 上下文会自动跨每个主机线程移植.因此,考虑到上述所有限制,您应该可以安全地从单个主机线程进行完整的固定内存设置。

关于multithreading - 多个 GPU 中的固定内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45203787/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com