CUDA内核导致“显示驱动程序无响应”,增加了4行

时间:2015-09-16 01:30:53

标签: c++ cuda

  

基本问题如下:

     

当我使用N个线程运行以下内核并且包含4个   用于实例化和填充ScaledLLA变量的行   工作正常。

     

当我使用N个线程运行以下内核并且执行包含4个线程时   用于实例化和填充GPU锁定的ScaledLLA变量的行   up,Windows抛出“显示驱动程序无响应”错误。

     

如果我通过减小网格大小来减少运行的线程数   一切正常。

我是CUDA的新手,并且已经逐步构建了一些GIS功能。

我的主机代码在内核调用时看起来像这样。

MapperKernel << <g_CUDAControl->aGetGridSize(), g_CUDAControl->aGetBlockSize() >> >(g_Deltas.lat, g_Deltas.lon, 32.2,
        g_DataReader->aGetMapper().aGetRPCBoundingBox()[0], g_DataReader->aGetMapper().aGetRPCBoundingBox()[1],
        g_CUDAControl->aGetBlockSize().x,
        g_CUDAControl->aGetThreadPitch(),
        LLA_Offset,
        LLA_ScaleFactor,
        RPC_XN,RPC_XD,RPC_YN,RPC_YD,
        Pixel_Offset, Pixel_ScaleFactor,
        device_array);
    cudaDeviceSynchronize(); //code crashes here
    host_array = (point3D*)malloc(num_bytes);
    cudaMemcpy(host_array, device_array, num_bytes, cudaMemcpyDeviceToHost);

正在调用的内核如下所示:

__global__ void MapperKernel(double deltaLat, double deltaLon, double passedAlt,
    double minLat, double minLon,
    int threadsperblock,
    int threadPitch,
    point3D LLA_Offset,
    point3D LLA_ScaleFactor,
    double * RPC_XN, double * RPC_XD, double * RPC_YN, double * RPC_YD,
    point2D pixelOffset, point2D pixelScaleFactor,
    point3D * rValue)
{
    //calculate thread's LLA
    int latindex = threadIdx.x + blockIdx.x*threadsperblock;
    int lonindex = threadIdx.y + blockIdx.y*threadsperblock;
    point3D LLA;
    LLA.lat = ((double)(latindex))*deltaLat + minLat;
    LLA.lon = ((double)(lonindex))*deltaLon + minLon;
    LLA.alt = passedAlt;
    //scale threads LLA - adding these four lines is what causes the problem
    point3D ScaledLLA;
    ScaledLLA.lat = (LLA.lat - LLA_Offset.lat) * LLA_ScaleFactor.lat;
    ScaledLLA.lon = (LLA.lon - LLA_Offset.lon) * LLA_ScaleFactor.lon;
    ScaledLLA.alt = (LLA.alt - LLA_Offset.alt) * LLA_ScaleFactor.alt;

    rValue[lonindex*threadPitch + latindex] = ScaledLLA; //if I assign LLA without calculating ScaledLLA everything works fine
}

如果我将LLA分配给rValue,那么一切都会快速执行,我得到预期的行为;然而,当我为ScaledLLA添加这四行并尝试将其分配给rValue时,CUDA需要太长时间才能满足Windows对cudaDeviceSynchronize()调用的喜好,并且我得到了一个 “显示驱动程序无响应”错误然后继续重置GPU。从环顾四周看,当Windows认为GPU没有响应时,就会出现这样的错误。我确信内核正在运行并执行正确的计算,因为我已经使用NSIGHT调试器逐步完成了它。

有没有人能够很好地解释为什么将这三行添加到内核会导致执行时间激增?

我正在运行Win7 VS 2013并安装了nsight 4.5。

1 个答案:

答案 0 :(得分:-2)

对于那些稍后通过搜索引擎到达这里的人。事实证明问题在于卡的内存不足。

这应该是最重要的事情之一,因为问题是在添加实例化之后才发生的。

这张卡只有很多内存(~2GB),而我的右边缓冲区占用了大部分(~1.5GB)。随着每个线程试图实例化自己的point3D变量,卡片就会耗尽内存。

对于那些感兴趣的人,NSight的探查员说这是一个cudaUknownError。

  

修复是为了降低运行内核的线程数