最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

gpuArray

GPU に格納される配列

説明

gpuArray オブジェクトは GPU に格納される配列を表します。gpuArray オブジェクトを扱うには、GPU 対応の MATLAB® 関数を使用します。この配列は直接計算したり、GPU で実行される CUDA カーネルで使用したりできます。詳細については、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 関数と同様に動作します。

classUnderlyinggpuArray または分散配列内の要素のクラス
existsOnGPUGPU で gpuArray または CUDAKernel が使用可能かどうかを判別する
isaUnderlyingtall 配列のデータが指定されたクラスかどうか判別
isequal配列の等価性を判別
isnumeric入力が数値配列かどうかを判別
issparse入力がスパースかどうかを判別
length最大の配列の次元の長さ
ndims配列の次元数
size配列サイズ

gpuArray オブジェクト用のその他のメソッドは多すぎるため、ここには記載しません。その多くは、同名の MATLAB 関数に似ており、動作も同じです。GPU での MATLAB 関数の実行を参照してください。

すべて折りたたむ

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

gpuDevice
ans = 
  CUDADevice with properties:

                      Name: 'GeForce GTX 1080'
                     Index: 1
         ComputeCapability: '6.1'
            SupportsDouble: 1
             DriverVersion: 10.1000
            ToolkitVersion: 10.1000
        MaxThreadsPerBlock: 1024
          MaxShmemPerBlock: 49152
        MaxThreadBlockSize: [1024 1024 64]
               MaxGridSize: [2.1475e+09 65535 65535]
                 SIMDWidth: 32
               TotalMemory: 8.5899e+09
           AvailableMemory: 6.9012e+09
       MultiprocessorCount: 20
              ClockRateKHz: 1733500
               ComputeMode: 'Default'
      GPUOverlapsTransfers: 1
    KernelExecutionTimeout: 1
          CanMapHostMemory: 1
           DeviceSupported: 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                4  gpuArray              

gpuArray を処理するには、GPU 対応の MATLAB 関数を使用します。MATLAB は自動的に計算を GPU で実行します。詳細については、GPU での MATLAB 関数の実行を参照してください。たとえば、diagexpmmodroundabs および fliplr を組み合わせて使用します。

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 と CPU の数値の精度およびアルゴリズムの違いにより結果に差異が生じることがあります。CPU および GPU での解は両方とも、真の解析結果に対して等しく有効な浮動小数点数の近似ですが、計算中に異なる丸めが行われていることがあります。この例の結果は整数であり、round により丸め誤差が除去されています。

この例では、MATLAB の関数と演算子を gpuArrays と共に使用し、モンテカルロ積分法で関数の積分を計算する方法を説明します。

サンプリングする点数を定義します。関数の領域、つまり 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;

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

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

    3.1403

この例では、GPU 対応の MATLAB 関数を使用して、有名な数学的構成であるマンデルブロ集合を計算する方法を説明します。関数gpuDeviceを使用して GPU をチェックしてください。

パラメーターを定義します。実数部および虚数部のグリッド上にマンデルブロ アルゴリズムが反復されます。次のコードは反復回数、グリッド サイズおよびグリッドの範囲を定義します。

maxIterations = 500;
gridSize = 1000;
xlim = [-0.748766713922161, -0.748766707771757];
ylim = [ 0.123640844894862,  0.123640851045266]; 

関数gpuArrayを使用してデータを GPU に転送し、gpuArray を作成できます。また、GPU 上で直接配列を作成することもできます。gpuArraylinspace などのデータ配列を作成するために使用できる多くの関数の GPU バージョンを提供します。詳細については、GPU 配列の直接作成を参照してください。

x = gpuArray.linspace(xlim(1),xlim(2),gridSize);
y = gpuArray.linspace(ylim(1),ylim(2),gridSize);
whos x y
  Name      Size              Bytes  Class       Attributes

  x         1x1000                4  gpuArray              
  y         1x1000                4  gpuArray              

多くの MATLAB 関数が gpuArrays をサポートしています。GPU 対応関数に gpuArray 引数を渡すと、その関数は自動的に GPU で実行されます。詳細については、GPU での MATLAB 関数の実行を参照してください。アルゴリズム用に複素数のグリッドを作成し、結果用に配列 count を作成します。GPU 上でこの配列を直接作成するには、関数 ones を使用し、'gpuArray' を指定します。

[xGrid,yGrid] = meshgrid(x,y);
z0 = complex(xGrid,yGrid);
count = ones(size(z0),'gpuArray');

次のコードは GPU 対応関数を使用してマンデルブロ アルゴリズムを実装しています。このコードは gpuArray を使用しているため、計算は GPU 上で実行されます。

z = z0;
for n = 0:maxIterations
    z = z.*z + z0;
    inside = abs(z) <= 2;
    count = count + inside;
end
count = log(count);

計算の終了後に結果をプロットします。

imagesc(x,y,count)
colormap([jet();flipud(jet());0 0 0]);
axis off

ヒント

  • パフォーマンスを向上させる必要がある場合、または関数が 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')rand(___,'gpuArray')
false(___,'gpuArray')randi(___,'gpuArray')
Inf(___,'gpuArray')randn(___,'gpuArray')
NaN(___,'gpuArray')gpuArray.colon
ones(___,'gpuArray')gpuArray.freqspace
true(___,'gpuArray')gpuArray.linspace
zeros(___,'gpuArray')gpuArray.logspace
 gpuArray.speye

接頭辞 gpuArray の付く関数について、クラス固有のヘルプを表示するには次を入力します。

help gpuArray.functionname

ここで、functionname はメソッドの名前です。たとえば、colon のヘルプを表示するには、次のように入力します。

help gpuArray.colon
R2010b で導入