使用Multi GPU NVIDIA的问题

时间:2014-12-23 10:40:42

标签: cuda multi-gpu

我正在学习如何在我的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分配的。

1 个答案:

答案 0 :(得分:1)

根据您提供的基于错误检查的新信息,您遇到的问题是由于ECC错误。

当GPU在当前会话中检测到双位ECC错误时,它将不再可用于计算活动,直到:

  1. 重置GPU(例如通过系统重启,或通过驱动程序卸载/重新加载,或通过nvidia-smi手动等),
  2. (或)

    1. ECC被禁用(通常也可能需要系统重启或gpu重置)
    2. 您可以使用nvidia-smi命令查看GPU的ECC状态。您可能已经知道哪个GPU报告了ECC错误,因为您已禁用ECC,但如果没有,则根据您的初始报告,它将是与cudaSetDevice(1);命令关联的那个,这可能应该是特斯拉C2070(即不是K40)。