多GPU中的固定内存

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

我基本上想知道的是固定内存是否与设备有关。

1个回答

3

自CUDA 4.0以来,运行时API本质上是线程安全的,并且在给定应用程序中,任何主机线程之间自动共享给定GPU上的上下文(请参见此处)。

此外,引用相关的文档

当应用程序以64位进程运行时,主机和所有计算能力为2.0及更高的设备使用单个地址空间。通过CUDA API调用进行的所有主机内存分配以及在支持的设备上进行的所有设备内存分配都在此虚拟地址范围内。因此: ... 通过cudaHostAlloc()进行的分配在使用统一地址空间的所有设备之间自动可移植(请参见可移植内存),并且cudaHostAlloc()返回的指针可以直接在这些设备上运行的内核中使用(即,无需通过cudaHostGetDevicePointer()获取设备指针,如映射内存中所述)。
因此,如果您的GPU和平台支持统一虚拟寻址,则固定/映射的主机内存会自动移植到该地址空间中的所有设备,并且每个GPU上下文会自动在每个主机线程之间移植。因此,鉴于上述所有限制,您可以安全地从单个主机线程执行完整的固定内存设置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接