2

ここに、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
4

1 に答える 1

5

重要な情報は、gpuDevice出力の次の部分です。

KernelExecutionTimeout: 1

これは、コンピューティング ジョブを実行している GPU でホスト ディスプレイ ドライバーがアクティブであることを意味します。NVIDIA ディスプレイ ドライバーにはウォッチドッグ タイマーが含まれており、画面の更新のためにドライバーに制御を戻すことなく、事前定義された時間を超えるタスクを強制終了します。これは、コンピューティング ジョブが長時間実行されているかスタックしているために、ディスプレイがフリーズしてマシンが応答しなくなる状況を防ぐことを目的としています。Matlab スクリプトの実行時間が、ディスプレイ ドライバーのウォッチドッグ タイマーの制限を明らかに超えています。それが発生すると、デバイスに保持されている計算コンテキストが破棄され、Matlab はデバイスで動作できなくなります。を呼び出すことでコンテキストを再初期化できる場合があります。resetこれは隠れて実行されると思いますcudaDeviceReset()

インターウェブには、このウォッチドッグ タイマーに関する多くの情報があります。たとえば、このスタック オーバーフローの質問です。このタイムアウトを変更する方法の解決策は、OS とハードウェアによって異なります。これを回避する最も簡単な方法は、ディスプレイ GPU で CUDA コードを実行しないか、コンピューティング ジョブの粒度を上げて、1 つの操作でタイムアウト制限を超えるランタイムが発生しないようにすることです。または、より高速なコードを記述してください...

于 2014-02-23T17:59:53.373 に答える