GPU在大型数组的Matlab中的gpuArray矩阵上崩溃

时间:2016-10-28 01:04:19

标签: matlab crash gpu nvidia matrix-multiplication

我试图在matlab中使用gpuArray进行简单的矩阵乘法。我正在使用配备4GB专用内存的NVIDIA GForce 960M GPU。代码如下。

function gpuExample(A, B)
     tic
     C = A*B;    % matrix product on Client
     tC = toc;
     % copy A and B from Client to GPU
     a = gpuArray(A); b = gpuArray(B);
     tic
     c = a*b;    % matrix product on GPU
     tgpu = toc;
     tic
     CC = gather(c);   % copy data from GPU to Client
     tg = toc;

     disp(['Matrix multiply time on Client is ' num2str(tC)])
     disp(['Matrix multiply time on GPU is ' num2str(tgpu)])
     disp(['Time for gathering data from GPU back to Client is '        
            num2str(tg)])

     % Verify that GPU and Client computations agree
     tol = 1e-5;
     if any(abs(CC-C) > tol)
         disp('Matrix product on Client and GPU disagree')
     else
         disp('Matrix product on Client and GPU agree')
     end
end   %

N=4000;
A=rand(N); 
B=rand(N);
gpuExample(A,B)

该代码适用于较小的矩阵,但是当我尝试使用矩阵维度4000X4000进行矩阵,GPU崩溃时,Matlab执行也是如此。

GPU输出如下:

  
    

gpuDevice

  

ans =

具有属性的CUDADevice:

                  Name: 'GeForce GTX 960M'
                 Index: 1
     ComputeCapability: '5.0'
        SupportsDouble: 1
         DriverVersion: 7.5000
        ToolkitVersion: 7.5000
    MaxThreadsPerBlock: 1024
      MaxShmemPerBlock: 49152
    MaxThreadBlockSize: [1024 1024 64]
           MaxGridSize: [2.1475e+09 65535 65535]
             SIMDWidth: 32
           TotalMemory: 4.2950e+09
   MultiprocessorCount: 5
          ClockRateKHz: 1176000
           ComputeMode: 'Default'
  GPUOverlapsTransfers: 1
KernelExecutionTimeout: 1
      CanMapHostMemory: 1
       DeviceSupported: 1
        DeviceSelected: 1

以下是崩溃报告:

  
    

警告:CUDA执行期间发生意外错误。 CUDA错误是:     CUDA_ERROR_LAUNCH_FAILED

  

对我来说,GPU应该足以将两个大小为4000X4000的矩阵相乘。它崩溃的原因。

2 个答案:

答案 0 :(得分:0)

这不是一个正确的答案,但堆栈溢出不会让我问一个问题,直到我有更高的声誉。

我很惊讶没有看到gpuDevice输出中列出的属性'AvailableMemory'。键入

时会发生什么
gpu = gpuDevice;
gpu.FreeMemory
gpu.AvailableMemory

这些移动芯片有时表现得很奇怪,并且他们不报告分配失败并不罕见。这是因为他们与计算内核共享视频内存的方式。所以要回答你的问题,这几乎可以肯定是因为你的芯片没有500MB左右的时间来进行计算。

答案 1 :(得分:0)

我有同样的问题,我有相同的GPU。

gpu = gpuDevice;
gpu.FreeMemory
gpu.AvailableMemory

使用这些命令,我​​们遇到了同样的问题。有必要重新启动matlab。

我发现的解决方案包括使用较小的矩阵:权衡计算与内存