我在进行cuda多gpu进行计算时,cudaSetDevice(i)设置使用第一张显卡计算(cudaSetDevice(0))的结果没有问题,但是在使用第二张显卡时(cudaSetDevice(1))却无法计算出正确的结果,cudaMemcpy后结果为初始的默认值,请问有没有老哥知道这是什么原因?
代码如下:
int pos = 0;
for (int i = 0; i < GPU_N; ++i)
{
cout << pos << endl;
cudaSetDevice(i);
cudaStreamCreate(&plan_n[i].stream);
cudaMallocHost((void **)&plan_n[i].prompt_proj_h, sizeof(real) * plan_n[i].nLor);
//plan_n[i].prompt_proj_h = new real[plan_n[i].nLor];
cudaMalloc((void**)&plan_n[i].prompt_proj, sizeof(real) * plan_n[i].nLor);
addKernel << < (nCountLOR + threads_N - 1) / threads_N, threads_N, 0, plan_n[i].stream >> >
(plan_n[i].prompt_proj, d_d, plan_n[i].nLor, Matrix_d, Count_d, Offset_d);
/*cudaMemcpy(plan_n[i].prompt_proj_h, plan_n[i].prompt_proj, sizeof(real) * plan_n[i].nLor, cudaMemcpyDeviceToHost);
for (int j = 0; j < plan_n[i].nLor; ++j)
Ad_h[pos + j] = plan_n[i].prompt_proj_h[j];*/
cudaMemcpy(Ad_h + pos, plan_n[i].prompt_proj, sizeof(real) * plan_n[i].nLor, cudaMemcpyDeviceToHost);
pos += plan_n[i].nLor;
}
建议用checkCudaErrors()检查一下函数的返回值,看看是否有报错。还有多GPU一般不是都用cudaMallocAsync()吗,你用同步的cudaMalloc(),多GPU实际上没有并行。在拷贝数据到GPU时请使用cudaMemcpyAsync替代cudaMemcpy,
在获取结果前请使用cudaStreamSynchronize(stream); // 同步该流,等待该流上的命令都完成