Main Content

gpuArray

GPU に格納される配列

説明

gpuArray オブジェクトは GPU メモリに格納される配列を表します。MATLAB® や他のツールボックスにある多数の関数が gpuArray オブジェクトをサポートしており、コードに最小限の変更を加えて GPU で実行することができます。gpuArray オブジェクトを扱うには、fftmtimesmldivide など、gpuArray 対応の任意の MATLAB 関数を使用します。MATLAB と他のツールボックスにおける gpuArray 対応の関数の完全なリストは、GPU をサポートする関数を参照してください。詳細については、GPU での MATLAB 関数の実行を参照してください。

GPU から配列を取得する場合は (gpuArray オブジェクトをサポートしていない関数を使用する場合など)、関数 gather を使用します。

メモ

GPU を使用できない場合は、gpuArray データが含まれる MAT ファイルをインメモリ配列として読み込むことができます。GPU なしで読み込まれた gpuArray オブジェクトには制限があり、計算には使用できません。GPU なしで読み込まれた gpuArray オブジェクトを使用するには、gather を使用して内容を取得します。

作成

gpuArray を使用して、MATLAB ワークスペース内の配列を gpuArray オブジェクトに変換します。一部の MATLAB 関数でも、gpuArray オブジェクトを直接作成することができます。詳細については、GPU での配列の確立を参照してください。

説明

G = gpuArray(X) は配列 X を GPU にコピーし、gpuArray オブジェクトを返します。

入力引数

すべて展開する

GPU に転送する配列。数値配列または logical 配列として指定します。GPU デバイスには、データを保存するために十分な空きメモリがなければなりません。X が既に gpuArray オブジェクトの場合、gpuArrayX を変更せずに出力します。

スパース配列も GPU に転送できます。gpuArray は、倍精度のスパース配列のみをサポートします。

例: G = gpuArray(magic(3));

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical
複素数のサポート: あり

オブジェクト関数

arrayfun関数を GPU 上の配列内の各要素に適用する
gather分散配列または gpuArray をローカル ワークスペースに転送
pagefun分散配列または GPU 配列の各ページに関数を適用

gpuArray オブジェクトの特性を調べるためのメソッドがいくつかあります。そのほとんどは同名の MATLAB 関数と同様に動作します。

isgpuarray入力が gpuArray であるかどうかの判別
existsOnGPUGPU で gpuArray または CUDAKernel が使用可能かどうかを判別する
isUnderlyingType入力に基となるデータ型が指定されているかどうかを判別
ndims配列の次元数
size配列サイズ
underlyingType配列の動作を決定する基となるデータの型

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

ツールボックス名gpuArray をサポートする関数のリストGPU 固有のドキュメンテーション
MATLABgpuArray をサポートする関数 
Statistics and Machine Learning Toolbox™gpuArray をサポートする関数 (Statistics and Machine Learning Toolbox)Analyze and Model Data on 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) 

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

すべて折りたたむ

CPU から GPU にデータを転送するには、関数 gpuArray を使用します。

配列 X を作成します。

X = [1,2,3];

X を GPU に転送します。

G = gpuArray(X);

データが GPU にあることを確認します。

isgpuarray(G)
ans = logical
   1

配列 G の要素ごとの二乗を計算します。

GSq = G.^2;

結果 GSq を CPU に戻します。

XSq = gather(GSq)
XSq = 1×3

     1     4     9

データが GPU にないことを確認します。

isgpuarray(XSq)
ans = logical
   0

いくつかの MATLAB 関数を使用し、オプション "gpuArray" を指定することにより、GPU で直接データを作成することができます。

乱数の配列を GPU で直接に作成します。

G = rand(1,3,"gpuArray")
G =

    0.3640    0.5421    0.6543

出力が GPU に格納されていることを確認します。

isgpuarray(G)
ans = logical
   1

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

gpuDevice
ans = 
  CUDADevice with properties:

                      Name: 'TITAN RTX'
                     Index: 1
         ComputeCapability: '7.5'
            SupportsDouble: 1
             DriverVersion: 11.2000
            ToolkitVersion: 11
        MaxThreadsPerBlock: 1024
          MaxShmemPerBlock: 49152
        MaxThreadBlockSize: [1024 1024 64]
               MaxGridSize: [2.1475e+09 65535 65535]
                 SIMDWidth: 32
               TotalMemory: 2.5770e+10
           AvailableMemory: 2.4177e+10
       MultiprocessorCount: 72
              ClockRateKHz: 1770000
               ComputeMode: 'Default'
      GPUOverlapsTransfers: 1
    KernelExecutionTimeout: 1
          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 により丸め誤差が除去されています。

この例では、MATLAB の関数と演算子を gpuArray オブジェクトと共に使用し、モンテカルロ積分法を使って関数の積分を計算する方法を説明します。

サンプリングする点数を定義します。関数の領域、つまり x 座標および y 座標の両方の区間 [-1,1] に関数 rand でランダムな点を作成し、その点をサンプリングします。GPU 上で乱数配列を直接作成するには、関数 rand を使用し、"gpuArray" を指定します。詳細については、GPU での配列の確立を参照してください。

n = 1e6;
x = 2*rand(n,1,"gpuArray")-1;
y = 2*rand(n,1,"gpuArray")-1;

被積分関数を定義し、それにモンテカルロ積分の式を使用します。この関数は、単位円内の点をサンプリングすることによりπ の値を近似します。コードは gpuArray 対応の関数と演算子を gpuArray オブジェクトに対し使用するため、計算は自動的に GPU で実行されます。MATLAB 配列に使用するものと同じ構文を使用して、要素単位の乗算などの二項演算を実行できます。gpuArray 対応の関数の詳細については、GPU での MATLAB 関数の実行を参照してください。

f = x.^2 + y.^2 <= 1;
result = 4*1/n*f*ones(n,1,"gpuArray")
result =

    3.1403

ヒント

  • パフォーマンスを向上させる必要がある場合、または関数が GPU で使用できない場合、gpuArray は次のオプションをサポートしています。

    • gpuArray オブジェクトに関する純粋に要素単位のコードをプリコンパイルして実行するには、関数 arrayfun を使用します。

    • CUDA® デバイス コードまたはライブラリ呼び出しを含む C++ コードを実行するには、MEX 関数を使用します。詳細については、CUDA コードを含む MEX 関数の実行を参照してください。

    • CUDA C++ で記述された既存の GPU カーネルを実行するには、MATLAB CUDAKernel インターフェイスを使用します。詳細については、GPU での CUDA または PTX コードの実行を参照してください。

    • MATLAB コードから CUDA コードを生成するには、GPU Coder™ を使用します。詳細については、GPU Coder 入門 (GPU Coder)を参照してください。

  • gpurng を使用して、GPU での乱数ストリームを制御できます。

  • 次のいずれも intmax("int32") を超えてはなりません。

    • 密配列の要素数。

    • スパース配列の非ゼロ要素数。

    • 指定された次元のサイズ。たとえば、zeros(0,3e9,"gpuArray") は許可されません。

代替方法

一部の MATLAB 関数では、gpuArray 出力を指定することにより、gpuArray オブジェクトを作成することもできます。次の表は、gpuArray オブジェクトを直接作成することが可能な MATLAB 関数の一覧です。詳細については、関数リファレンス ページの「拡張機能」節を参照してください。

eye(___,"gpuArray")true(___,"gpuArray")
false(___,"gpuArray")zeros(___,"gpuArray")
Inf(___,"gpuArray")gpuArray.colon
NaN(___,"gpuArray")gpuArray.freqspace
ones(___,"gpuArray")gpuArray.linspace
rand(___,"gpuArray")gpuArray.logspace
randi(___,"gpuArray")gpuArray.speye
randn(___,"gpuArray") 

バージョン履歴

R2010b で導入