【问题标题】:Why did the multiple GPU CUDA codes fail?为什么多个 GPU CUDA 代码会失败?
【发布时间】:2012-12-19 22:10:37
【问题描述】:

我第一次使用以下多 GPU CUDA 代码:

int main( void ) { 
    int count;
    cudaGetDeviceCount( &count );
    float** gtt = new float*[count];
    for (int i=0; i< count; i++) {
        cudaSetDevice(i);
        int j;
        cudaGetDevice(&j);
        printf("get device %d\n",j);
        cudaMalloc((void**)&gtt[i], 2*sizeof(float));
        cudaFree(gtt[i]);
    }   
}

我在同一个节点上发现了 3 个设备,但在运行的第二个 GPU 上出现了段故障。我的 CUDA 版本为 4010,计算能力为 2.0。

【问题讨论】:

  • 您应该为每个 API 调用添加错误检查。您可能缺少一些重要信息。
  • @ talonmies 我做了,但结果是一样的。
  • 段错误通常意味着您访问的内存超出了 cpu 的范围。只需在执行 cudaMalloc 之前打印出 ptr gtt[i]。
  • @Pavan 在第一个设备的 cudaMalloc 之后,gtt[i] 从 (nil) 变为 "0x200200000";但是在第二个设备的 cudaMalloc 之后出现分段错误。请注意,无论第一台或第二台设备是什么,都会发生这种情况。

标签: cuda gpu


【解决方案1】:

最终我发现了问题所在。我已经通过以下方式设置了 cuda 分析环境:

export COMPUTE_PROFILE=1
export COMPUTE_PROFILE_LOG=cuda_profile.log

第二行导致问题。当不同的 gpus 写入同一个分析日志文件时,可能会发生一些冲突。将第二行更改为:

export COMPUTE_PROFILE_LOG=cuda_profile_%p_%d.log

解决问题。

【讨论】:

    猜你喜欢
    • 2016-03-17
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多