Main Content

GPU での MATLAB 関数の実行

MATLAB® 関数を GPU で実行してコードを高速化できます。MATLAB での GPU 計算には Parallel Computing Toolbox™ が必要です。

gpuArray 引数をもつ MATLAB 関数

MATLAB および他のツールボックスの多くの関数は gpuArray データ引数を渡すことで自動的に GPU で実行されます。MATLAB の gpuArray は GPU に格納される配列を表します。

A = gpuArray([1 0 1; -1 -2 0; 0 1 -1]);
e = eig(A);

少なくとも 1 つの gpuArray をデータ入力引数としてこれらの関数を呼び出すたびに、その関数が GPU で実行されます。関数は、ローカル ワークスペースに数値データを返す方が適切である場合 (例: size) を除き、結果として gpuArray を生成します。同じ関数呼び出しで gpuArray データとホスト メモリに格納された配列の両方を使用して、入力を混在させることができます。gpuArray 対応の関数には、離散フーリエ変換 (fft)、行列乗算 (mtimes)、行列の左除算 (mldivide)、および他の数百の関数があります。

gpuArray 入力の条件

GPU 対応関数は、入力データが GPU にある場合にのみ GPU で実行されます。次元やインデックスなどのパラメーター引数のデータ型は、関数が実行される場所に影響しません。たとえば、次のコードの関数 sum は、データ (最初の入力) が GPU にあるため GPU で実行されます。

A = rand(10);
d = 2;
sum(gpuArray(A),d);
一方、次のコードの関数 sum は、データ (最初の入力) が GPU にないため GPU で実行されません。
A = rand(10);
d = 2;
sum(A,gpuArray(d));

GPU 上での複素数の処理

GPU で実行される関数の出力が複素数になる可能性がある場合は、明示的に入力引数を複素数として指定しなければなりません。詳細については、GPU 上での複素数の処理を参照してください。

GPU 上でのスパース配列の処理

関数 sparse を使用してスパースな gpuArray オブジェクトを作成できます。多くの MATLAB 関数はスパースな gpuArray オブジェクトをサポートします。詳細については、GPU 上でのスパース配列の処理を参照してください。

gpuArray をサポートする関数の確認

複数の MATLAB ツールボックスに、gpuArray をサポートする関数が含まれています。これらのツールボックスに含まれる、gpuArray オブジェクトをサポートするすべての関数のリストを表示するには、次の表のリンクを使用してください。リスト内にある情報インジケーター付きの関数には、関数を GPU 上で実行する場合に固有の制限または使用に関するメモがあります。使用に関するメモと制限は、関数のリファレンス ページの「拡張機能」の節で確認できます。個々の gpuArray 対応関数の更新の詳細については、リリース ノートを参照してください。

ツールボックス名gpuArray をサポートする関数のリストGPU 固有のドキュメンテーション
MATLABgpuArray をサポートする関数 
Statistics and Machine Learning Toolbox™gpuArray をサポートする関数 (Statistics and Machine Learning Toolbox)GPU でのデータの解析とモデル化 (Statistics and Machine Learning Toolbox)
Image Processing Toolbox™gpuArray をサポートする関数 (Image Processing Toolbox)GPU コンピューティング (Image Processing Toolbox)
Deep Learning Toolbox™

gpuArray をサポートする関数 (Deep Learning Toolbox)

*(GPU を使用した深層学習も参照)

Scale Up Deep Learning in Parallel, on GPUs, and in the Cloud (Deep Learning Toolbox)

MATLAB による複数の GPU での深層学習 (Deep Learning Toolbox)

Computer Vision Toolbox™gpuArray をサポートする関数 (Computer Vision Toolbox)GPU コード生成と高速化 (Computer Vision Toolbox)
Communications Toolbox™gpuArray をサポートする関数 (Communications Toolbox)コード生成と高速化のサポート (Communications Toolbox)
Signal Processing Toolbox™gpuArray をサポートする関数 (Signal Processing Toolbox)コード生成と GPU サポート (Signal Processing Toolbox)
Audio Toolbox™gpuArray をサポートする関数 (Audio Toolbox)Code Generation and GPU Support (Audio Toolbox)
Wavelet Toolbox™gpuArray をサポートする関数 (Wavelet Toolbox)コード生成と GPU サポート (Wavelet Toolbox)
Curve Fitting Toolbox™gpuArray をサポートする関数 (Curve Fitting Toolbox) 

すべての MathWorks® 製品の gpuArray をサポートする関数のリストについては、gpuArray をサポートする関数を参照してください。あるいは、製品別にフィルター処理できます。[ヘルプ] バーで [関数] をクリックします。関数リストの左ペインを参照し、MATLAB などの製品を選択します。左ペイン下部で、[GPU 配列] を選択します。gpuArray 対応の関数のない製品を選択した場合、[GPU 配列] フィルターは使用できません。

GPU を使用した深層学習

Deep Learning Toolbox の多くの関数では、サポートされる GPU と Parallel Computing Toolbox があれば、GPU が自動的にサポートされます。データを gpuArray に変換する必要はありません。以下は、GPU (使用できる場合) で既定で実行される一部の関数のリストです。

Deep Learning Toolbox での自動 GPU サポートの詳細については、Scale Up Deep Learning in Parallel, on GPUs, and in the Cloud (Deep Learning Toolbox)を参照してください。

dlnetwork (Deep Learning Toolbox) オブジェクトまたはモデル関数として定義されたネットワークを使用するネットワークおよびワークフローでは、データを gpuArray に変換してください。GPU でカスタムの学習ループまたは推論を実行するには、gpuArray をサポートする関数 (Deep Learning Toolbox)を使用してください。

GPU のチェックまたは選択

サポートされる GPU がある場合、MATLAB は自動的に GPU での計算に使用します。複数の GPU がある場合は、gpuDeviceTable を使用して、システムで検出されたすべての GPU のプロパティを調べることができます。gpuDevice を使用してその 1 つを選択するか、並列プールで複数の GPU を使用することができます。詳細については、GPU デバイスの識別と選択および複数の GPU での MATLAB 関数の実行を参照してください。GPU がサポートされていることをチェックするには、GPU 計算の要件を参照してください。

gpuDeviceTable
    Index           Name           ComputeCapability    DeviceAvailable    DeviceSelected
    _____    __________________    _________________    _______________    ______________

      1      "NVIDIA RTX A5000"          "8.6"               true              true      
      2      "Quadro P620"               "6.1"               true              false     

GPU での MATLAB 関数の使用

この例では、gpuArray 対応の MATLAB 関数を使用して gpuArray オブジェクトを処理する方法を説明します。関数gpuDeviceを使用して GPU のプロパティをチェックできます。

gpuDevice
ans = 
  CUDADevice with properties:

                      Name: 'NVIDIA RTX A5000'
                     Index: 1
         ComputeCapability: '8.6'
            SupportsDouble: 1
             DriverVersion: 11.6000
            ToolkitVersion: 11.2000
        MaxThreadsPerBlock: 1024
          MaxShmemPerBlock: 49152 (49.15 KB)
        MaxThreadBlockSize: [1024 1024 64]
               MaxGridSize: [2.1475e+09 65535 65535]
                 SIMDWidth: 32
               TotalMemory: 25553076224 (25.55 GB)
           AvailableMemory: 25153765376 (25.15 GB)
       MultiprocessorCount: 64
              ClockRateKHz: 1695000
               ComputeMode: 'Default'
      GPUOverlapsTransfers: 1
    KernelExecutionTimeout: 0
          CanMapHostMemory: 1
           DeviceSupported: 1
           DeviceAvailable: 1
            DeviceSelected: 1

-15 ~ 15 の値を繰り返す行ベクトルを作成します。これを GPU に転送して gpuArray オブジェクトを作成するには、関数gpuArrayを使用します。

X = [-15:15 0 -15:15 0 -15:15];
gpuX = gpuArray(X);
whos gpuX
  Name      Size            Bytes  Class       Attributes

  gpuX      1x95              760  gpuArray              

gpuArray オブジェクトを処理するには、任意の gpuArray 対応の MATLAB 関数を使用します。MATLAB は自動的に計算を GPU で実行します。詳細については、GPU での MATLAB 関数の実行を参照してください。たとえば、diagexpmmodroundabsfliplr を一緒に使用します。

gpuE = expm(diag(gpuX,-1)) * expm(diag(gpuX,1));
gpuM = mod(round(abs(gpuE)),2);
gpuF = gpuM + fliplr(gpuM);

結果をプロットします。

imagesc(gpuF);
colormap(flip(gray));

GPU からデータを転送して収集する必要がある場合は、gather を使用します。CPU へと戻すデータ転送は高コストになる可能性があり、gpuArray をサポートしない関数で結果を利用する必要がある場合を除いて、一般に転送は不要です。

result = gather(gpuF);
whos result
  Name         Size            Bytes  Class     Attributes

  result      96x96            73728  double              

一般に、コードを CPU と GPU で実行すると、GPU と CPU 間で数値の精度とアルゴリズムが異なっていることから、結果に差異が生じることがあります。CPU および GPU からの解はいずれも、真の解析結果に対し等しく有効な浮動小数点数の近似ですが、計算中に異なる丸め動作が行われています。この例の結果は整数であり、round により丸め誤差が除去されています。

GPU の使用例

GPU での MATLAB 関数の実行例

以下の例では、サポートされる MATLAB 関数に gpuArray オブジェクトを渡し、それらの関数を GPU で実行しています。

その他の GPU の使用例

以下の例では、他の自動 GPU サポートを利用しています。

謝辞

MAGMA は、GPU 高速化を利用する線形代数ルーチンのライブラリです。gpuArray オブジェクト用として Parallel Computing Toolbox に実装された線形代数関数は、MAGMA を利用して高いパフォーマンスと精度を実現しています。

参考

| | |

関連する例

詳細