GPU 上的计算导致驱动程序错误“停止响应”

Posted

技术标签:

【中文标题】GPU 上的计算导致驱动程序错误“停止响应”【英文标题】:Calculation on GPU leads to driver error "stopped responding" 【发布时间】:2014-03-25 03:42:56 【问题描述】:

我在这里有一个在 MATLAB R2013b 中执行的小脚本:

clear all;

n = 2000;
times = 50;
i = 0;

tCPU = tic;

disp 'CPU::'
A = rand(n, n);
B = rand(n, n);
disp '::Go'
for i = 0:times
    CPU = A * B;
end

tCPU = toc(tCPU);
tGPU = tic;

disp 'GPU::'
A = gpuArray(A);
B = gpuArray(B);
disp '::Go'
for i = 0:times
    GPU =  A * B ; 
end
tGPU = toc(tGPU);

fprintf('On CPU: %.2f sec\nOn GPU: %.2f sec\n', tCPU, tGPU);

不幸的是,执行后我收到一条来自 Windows 的消息:“显示驱动程序停止工作并已恢复。”。

我认为这意味着 Windows 没有从我的显卡驱动程序或其他东西那里得到响应。脚本返回没有错误:

>> test
CPU::
::Go
GPU::
::Go
On CPU: 11.01 sec
On GPU: 2.97 sec

但是无论GPU是否内存不足,MATLAB在我重新启动之前都无法使用GPU设备。如果我不重新启动 MATLAB,我只会收到一条来自 CUDA 的消息:

>> test
Warning: An unexpected error occurred during CUDA
execution. The CUDA error was:
CUDA_ERROR_LAUNCH_TIMEOUT 
> In test at 1 
Warning: An unexpected error occurred during CUDA
execution. The CUDA error was:
CUDA_ERROR_LAUNCH_TIMEOUT 
> In test at 1 
Warning: An unexpected error occurred during CUDA
execution. The CUDA error was:
CUDA_ERROR_LAUNCH_TIMEOUT 
> In test at 1 
Warning: An unexpected error occurred during CUDA
execution. The CUDA error was:
CUDA_ERROR_LAUNCH_TIMEOUT 
> In test at 1 
CPU::
::Go
GPU::
Error using gpuArray
An unexpected error occurred during CUDA execution.
The CUDA error was:
the launch timed out and was terminated

Error in test (line 21)
A = gpuArray(A);

有人知道如何避免这个问题或我在这里做错了什么吗?

如果需要,我的 GPU 设备:

>> gpuDevice

ans = 

  CUDADevice with properties:

                      Name: 'GeForce GTX 660M'
                     Index: 1
         ComputeCapability: '3.0'
            SupportsDouble: 1
             DriverVersion: 6
            ToolkitVersion: 5
        MaxThreadsPerBlock: 1024
          MaxShmemPerBlock: 49152
        MaxThreadBlockSize: [1024 1024 64]
               MaxGridSize: [2.1475e+09 65535 65535]
                 SIMDWidth: 32
               TotalMemory: 2.1475e+09
                FreeMemory: 1.9037e+09
       MultiprocessorCount: 2
              ClockRateKHz: 950000
               ComputeMode: 'Default'
      GPUOverlapsTransfers: 1
    KernelExecutionTimeout: 1
          CanMapHostMemory: 1
           DeviceSupported: 1
            DeviceSelected: 1

【问题讨论】:

可能使用相同的 gpu 进行桌面 UI 渲染。您需要从 Windows 注册表中禁用超时值。 【参考方案1】:

关键信息是gpuDevice 输出的这一部分:

KernelExecutionTimeout: 1

这意味着主机显示驱动程序在您运行计算作业的 GPU 上处于活动状态。 NVIDIA 显示驱动程序包含一个看门狗定时器,它会终止任何花费超过预定义时间量的任务,而不会将控制权交还给驱动程序以进行屏幕刷新。这是为了防止长时间运行或卡住的计算作业通过冻结显示而导致机器无响应的情况。您的 Matlab 脚本的运行时间明显超过了显示驱动程序看门狗定时器的限制。一旦发生这种情况,设备上保存的计算上下文就会被破坏,Matlab 就不能再在设备上运行。你或许可以通过调用reset 来重新初始化上下文,我猜它会在后台运行cudaDeviceReset()

互联网上有很多关于这个看门狗定时器的信息——例如this Stack Overflow question。如何修改此超时的解决方案取决于您的操作系统和硬件。避免这种情况的最简单方法是不在显示 GPU 上运行 CUDA 代码,或者增加计算作业的粒度,以便没有一个操作的运行时间超过超时限制。或者只是编写更快的代码...

【讨论】:

谢谢。这就是问题所在。还没弄清楚如何更改超时值,但reset(gpuDevice(x)) 工作正常!

以上是关于GPU 上的计算导致驱动程序错误“停止响应”的主要内容,如果未能解决你的问题,请参考以下文章

javplayer显示未响应

此页面上的脚本造成Web浏览器运行速度减慢。如果继续运行,您的计算机将可能停止响应。

用python写GPU上的并行计算程序,有啥库或者编译器

windows7资源管理器未响应,发生以下错误,怎么解决?

OpenCL:GPU 上的单个计算设备?

gpu上的并行减少和计算错误的opencl