Расчет на GPU приводит к ошибке драйвера "перестал отвечать"
У меня есть этот маленький бессмысленный скрипт, который я выполняю в 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 не может использовать устройство с графическим процессором, пока я не перезапустил его. Если я не перезагружаю 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);
Кто-нибудь знает, как избежать этой проблемы или что я здесь не так делаю?
При необходимости, мое устройство с графическим процессором:
>> 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
1 ответ
Ключевой частью информации является эта часть gpuDevice
выход:
KernelExecutionTimeout: 1
Это означает, что драйвер дисплея хоста активен на графическом процессоре, на котором выполняются вычислительные задания. Драйвер дисплея NVIDIA содержит сторожевой таймер, который убивает любую задачу, которая занимает более предварительно определенного периода времени, не возвращая управление драйверу для обновления экрана. Это сделано для того, чтобы предотвратить ситуацию, когда длительное выполнение или зависание вычислительного задания приводит к тому, что машина перестает отвечать на запросы из-за зависания дисплея. Время выполнения вашего скрипта Matlab явно превышает ограничение сторожевого таймера драйвера дисплея. Как только это происходит, контекст вычислений, хранящийся на устройстве, уничтожается, и Matlab больше не может работать с устройством. Вы могли бы быть в состоянии повторно инициализировать контекст, вызвав reset
, который я думаю, будет работать cudaDeviceReset()
под прикрытием.
На межсетевом уровне содержится много информации об этом сторожевом таймере - например, этот вопрос переполнения стека. Решение о том, как изменить это время ожидания, зависит от вашей ОС и оборудования. Самый простой способ избежать этого - не запускать код CUDA на графическом процессоре или увеличивать степень детализации ваших вычислительных заданий, чтобы ни у одной операции не было времени выполнения, превышающего ограничение времени ожидания. Или просто написать более быстрый код...