2016-10-28 23 views
0

matlabでgpuArrayを使って単純な行列乗算をしようとしています。私は4GBの専用メモリを搭載したNVIDIA GForce 960M GPUを使用しています。コードは以下の通りです。MatlabのgpuArray行列で大きな配列の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

「N」の値が小さいほどクラッシュしませんか? – mpaskov

+0

はい、それはNの低い数のために働いています。私はN = 3500までテストし、それは正常に動作します –

答えて

0

これは適切な答えではありませんが、スタックのオーバーフローは私が高い評価を得るまで質問をさせません。

出力に表示されている「AvailableMemory」プロパティが表示されないことに驚いています。gpuDevice。タイプするとどうなりますか

gpu = gpuDevice; 
gpu.FreeMemory 
gpu.AvailableMemory 

これらのモバイルチップは、ときどき異常に動作し、割り当ての失敗を報告しないことは珍しくありません。これは、ビデオメモリを計算カーネルと共有するためです。あなたの質問に答えるには、あなたのチップが計算を実行するのに必要な500MB程度を持っていないので、これはほぼ確実です。

関連する問題