Cuda 使用多GPU NVIDIA的问题

Cuda 使用多GPU NVIDIA的问题,cuda,multi-gpu,Cuda,Multi Gpu,我正在学习如何在CUDA应用程序中使用多GPU。我尝试了一个简单的程序,它成功地运行在一个有两台特斯拉C2070的系统上。但是当我试图在一个不同的系统上运行相同的程序,该系统有一个特斯拉K40c和一个特斯拉C2070,它显示了一个分段错误。有什么问题吗?我确信代码没有问题。在环境中是否需要进行任何设置?我在这里附上了我的代码供您参考 #include <stdio.h> #include "device_launch_parameters.h" #include "cuda_runt

我正在学习如何在CUDA应用程序中使用多GPU。我尝试了一个简单的程序,它成功地运行在一个有两台特斯拉C2070的系统上。但是当我试图在一个不同的系统上运行相同的程序,该系统有一个特斯拉K40c和一个特斯拉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;
}
#包括
#包括“设备启动参数.h”
#包括“cuda_runtime_api.h”
__全局无效测试(int*a)
{
int i=blockIdx.x*blockDim.x+threadIdx.x;
a[i]=a[i]*2;
}
int main()
{
int*ai、*bi、*ao、*bo;
国际热核实验堆;
cudaStream_t streamA,streamB;
cudaSetDevice(0);
cudaStreamCreate(&streamA);
Cudamaloc((void**)和ao,10*sizeof(int));
cudaHostAlloc((无效**)和ai,10*sizeof(内部),cudaHostAllocMapped);

对于(iter=0;iter,根据错误检查提供的新信息,您遇到的问题是由于ECC错误

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

  • GPU复位(例如,通过系统重新启动,或通过驱动程序卸载/重新加载,或通过nvidia smi手动复位等)
  • (或)

  • ECC被禁用(通常还需要系统重新启动或gpu重置)

  • 您可以使用
    nvidia smi
    命令查看GPU的ECC状态。您可能已经知道哪个GPU报告了ECC错误,因为您禁用了ECC,但如果没有禁用,则根据您的初始报告,它将是与
    cudaSetDevice(1)关联的GPU;
    命令,可能应该是特斯拉C2070(即不是K40).

    使用cuda 6.5在k20和quadro k5000上编译并运行良好。得到以下结果:2 4 6 8 10 22 24 26 28 30感谢Christian Park。我看到了错误代码,这是因为“遇到了不可纠正的ECC错误”。当我尝试在第二个GPU(cudaMalloc((void**)和bo,10*sizeof(int))中分配内存时,会发生此错误。我禁用了ECC支持,它在有一个k40c和一个特斯拉c2070的系统中运行良好。这是因为体系结构不同吗?谢谢Robert。没错,第二个设备是特斯拉c2070。我刚刚从指定的链接看到了此文档,不建议混合不同体系结构的GPU。谢谢。您的链接p当然,这与特斯拉GPU的一般使用是完全不同的。当混合不同代的GPU时,会出现一些技术问题(例如,与P2P传输相关),因此,大规模使用GPU可能不是一个好主意,但这并不是您在此报告的问题的根源。