我正在使用四个GPU,为了加快内存传输速度,我试图使用cudaHostAlloc()来使用固定内存。
主UI线程(基于MFC)创建4个线程,并且每个线程都调用cudaSetDevice(nDeviceID)。
我的问题是:我可以在主线程中调用cudaHostAlloc()并将指针作为lParam传递吗?还是必须在调用cudaSetDevice(nDeviceID)之后在每个分支线程中调用它?
以下是伪代码:
1)在主线程中调用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);
我基本上想知道的是固定内存是否与设备有关。