【发布时间】: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**)>t[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 之后出现分段错误。请注意,无论第一台或第二台设备是什么,都会发生这种情况。