2016-10-28 3 views
0

Я пытаюсь сделать простое матричное умножение с помощью gpuArray в matlab. Я использую GPU NVIDIA GForce 960M с выделенной памятью 4 ГБ. Код приведен ниже.Сбой GPU на матрице gpuArray в Matlab для большого массива

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.

Выход ГПУ выглядит следующим образом:

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

Для меня ГПУ должно быть достаточно для перемножения двух матриц размером 4000x4000. почему он рушится.

+0

и с меньшими значениями 'N' он не падает? – mpaskov

+0

Да, он работает для более низкого числа N. Я тестировал до N = 3500, и он отлично работает –

ответ

0

Это не правильный ответ, но переполнение стека не позволит мне задать вопрос, пока у меня не будет более высокая репутация.

Я удивлен, не увидев, что свойство «AvailableMemory» указано в выводе gpuDevice. Что происходит, когда вы набираете

gpu = gpuDevice; 
gpu.FreeMemory 
gpu.AvailableMemory 

Эти мобильные чипы ведут себя странно, иногда и это не редкость для них не сообщать ошибок при распределении. Это связано с тем, как они совместно используют видеопамять с вычислительными ядрами. Поэтому, чтобы ответить на ваш вопрос, это почти наверняка, потому что у вашего чипа нет 500 МБ или около того, необходимых для выполнения вычислений.

Смежные вопросы