cudaSetDevice(i)使用出现问题

我在进行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;

}

https://blog.csdn.net/gaodaweia/article/details/124782581?spm=1005.2026.3001.5635&utm_medium=distribute.pc_relevant_ask_down.none-task-blog-2~default~OPENSEARCH~Rate-4-124782581-ask-7760929.pc_feed_download_top3ask&depth_1-utm_source=distribute.pc_relevant_ask_down.none-task-blog-2~default~OPENSEARCH~Rate-4-124782581-ask-7760929.pc_feed_download_top3ask

建议用checkCudaErrors()检查一下函数的返回值,看看是否有报错。还有多GPU一般不是都用cudaMallocAsync()吗,你用同步的cudaMalloc(),多GPU实际上没有并行。

在拷贝数据到GPU时请使用cudaMemcpyAsync替代cudaMemcpy,
在获取结果前请使用cudaStreamSynchronize(stream); // 同步该流,等待该流上的命令都完成