我正在学习如何在我的CUDA应用程序中使用多GPU。我尝试了一个简单的程序,该程序在具有两个Tesla C2070的系统上成功运行。但是当我尝试在具有Tesla K40c和Tesla C2070的不同系统上运行相同的程序时,它显示出分段错误。可能是什么问题?我确信代码没有问题。是否有任何设置要在环境中完成?我在这里附上了我的代码供您参考。
#include <stdio.h>
#include "device_launch_parameters.h"
#include "cuda_runtime_api.h"
__global__ void testA(int *a)
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
a[i] = a[i] * 2;
}
int main()
{
int *ai, *bi, *ao, *bo;
int iter;
cudaStream_t streamA, streamB;
cudaSetDevice(0);
cudaStreamCreate(&streamA);
cudaMalloc((void**)&ao, 10 * sizeof(int));
cudaHostAlloc((void**)&ai, 10 * sizeof(int), cudaHostAllocMapped);
for(iter=0; iter<10; iter++)
{
ai[iter] = iter+1;
}
cudaSetDevice(1);
cudaStreamCreate(&streamB);
cudaMalloc((void**)&bo, 10 * sizeof(int));
cudaHostAlloc((void**)&bi, 10 * sizeof(int), cudaHostAllocMapped);
for(iter=0; iter<10; iter++)
{
bi[iter] = iter+11;
}
cudaSetDevice(0);
cudaMemcpyAsync(ao, ai, 10 * sizeof(int), cudaMemcpyHostToDevice, streamA);
testA<<<1, 10, 0, streamA>>>(ao);
cudaMemcpyAsync(ai, ao, 10 * sizeof(int), cudaMemcpyDeviceToHost, streamA);
cudaSetDevice(1);
cudaMemcpyAsync(bo, bi, 10 * sizeof(int), cudaMemcpyHostToDevice, streamB);
testA<<<1, 10, 0, streamB>>>(bo);
cudaMemcpyAsync(bi, bo, 10 * sizeof(int), cudaMemcpyDeviceToHost, streamB);
cudaSetDevice(0);
cudaStreamSynchronize(streamA);
cudaSetDevice(1);
cudaStreamSynchronize(streamB);
printf("%d %d %d %d %d\n",ai[0],ai[1],ai[2],ai[3],ai[4]);
printf("%d %d %d %d %d\n",bi[0],bi[1],bi[2],bi[3],bi[4]);
return 0;
}
当在for循环中初始化bi数组时发生分段错误,这意味着内存不是为bi分配的。
答案 0 :(得分:1)
根据您提供的基于错误检查的新信息,您遇到的问题是由于ECC错误。
当GPU在当前会话中检测到双位ECC错误时,它将不再可用于计算活动,直到:
nvidia-smi
手动等),(或)
您可以使用nvidia-smi
命令查看GPU的ECC状态。您可能已经知道哪个GPU报告了ECC错误,因为您已禁用ECC,但如果没有,则根据您的初始报告,它将是与cudaSetDevice(1);
命令关联的那个,这可能应该是特斯拉C2070(即不是K40)。