ドキュメンテーション

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

GPU での配列の確立

MATLAB®gpuArray は GPU に格納される配列を表します。GPU 上の配列をサポートする関数の詳細なリストについては、GPU での MATLAB 関数の実行を参照してください。

既存のデータからの GPU 配列の作成

GPU への配列送信

GPU 配列は、ワークスペースから既存の配列を GPU に転送することによって作成できます。MATLAB から GPU に配列を転送するには、関数 gpuArray を使用します。

N = 6;
M = magic(N);
G = gpuArray(M);

これは次の 1 行のコードで実現できます。

G = gpuArray(magic(N));

G は、GPU に格納されている魔方陣を表す MATLAB gpuArray オブジェクトとなります。gpuArray への入力は、数値 (例: singledoubleint8 など) または論理値でなければなりません (GPU 上での複素数の処理も参照)。

GPU からの配列の取得

GPU から MATLAB ワークスペースに配列を取得するには、関数 gather を使用します。これにより、gpuArray オブジェクトで表される GPU 上の配列を取得し、それを通常の MATLAB 配列として MATLAB ワークスペースに転送します。isequal を使用すると、正しい値を取得したことを確認できます。

G = gpuArray(ones(100,'uint32'));
D = gather(G);
OK = isequal(D,ones(100,'uint32'))

CPU への収集は高コストの可能性があるため、gpuArray をサポートしていない関数で結果を処理する必要がある場合を除いて、一般的に収集は不要です。

例: GPU への配列の転送

MATLAB で 1000 行 1000 列の乱数行列を作成し、GPU に転送します。

X = rand(1000);
G = gpuArray(X);

例: 指定した精度での配列の転送

MATLAB で倍精度の乱数値からなる行列を作成し、単精度として MATLAB から GPU に転送します。

X = rand(1000);
G = gpuArray(single(X));

GPU 配列の直接作成

gpuArray クラスのいくつかのメソッドを使用すると、配列を MATLAB ワークスペースから転送せずに、直接 GPU に作成できます。これらのコンストラクターでは配列のサイズとデータ クラスの情報のみが必要とされ、ワークスペースからの要素なしで配列を作成できます。

例: GPU での単位行列の作成

GPU に int32 型の 1024 行 1024 列の単位行列を作成するには、以下を入力します。

II = eye(1024,'int32','gpuArray');
size(II)
        1024        1024

1 つの数値引数により、2 次元行列が作成されます。

例: GPU での多次元配列の作成

GPU にデータ クラス double の 1 からなる 3 次元配列を作成するには、以下を入力します。

G = ones(100,100,50,'gpuArray');
size(G)
   100   100    50
classUnderlying(G)
double

データの既定のクラスは double であるため、指定する必要はありません。

例: GPU でのベクトルの作成

GPU にゼロからなる 8192 成分の列ベクトルを作成するには、以下を入力します。

Z = zeros(8192,1,'gpuArray');
size(Z)
        8192           1

列ベクトルでは、2 番目の次元のサイズは 1 です。

gpuArray の乱数ストリームの制御

GPU 上の乱数発生器関数 randrandn および randi は、CPU 上のクライアント MATLAB セッションとは異なる設定を使用します。以下の関数は GPU での乱数ストリームを制御します。

gpurng
parallel.gpu.RandStream

これらの関数は MATLAB の rng および RandStream と同様に実行されますが、GPU 上ではいくつかの制限があります。詳細については、gpurngを参照するか、次を入力してください。

help parallel.gpu.RandStream

GPU は既定で結合多重再帰発生器 ('CombRecursive' または 'mrg32k3a') を使用して一様分布乱数を作成し、逆関数法を使用して正規分布値を生成します。

GPU 上の既定の設定と同じ設定を使用するように、CPU 上のクライアント MATLAB セッションを設定するには、次のコマンドを使用します。

RandStream('CombRecursive','NormalTransform','Inversion');

ほとんどの場合、GPU 上の既定の乱数発生器が CPU 上の MATLAB の既定の発生器と異なっていても問題はありません。しかし、GPU と CPU の両方で同じ結果を再現する必要がある場合は、CPU の乱数発生器を適切に設定し、両方の発生器で同じシードを使用します。

seed=0; n=4;

cpu_stream = RandStream('CombRecursive','Seed',seed,'NormalTransform','Inversion');
RandStream.setGlobalStream(cpu_stream);

gpurng('CombRecursive',seed);

r = rand(n);             % On CPU
R = rand(n,'gpuArray');  % On GPU
OK = isequal(r,R)
    1

並列 MATLAB コードを実行するときに、ワーカー MATLAB セッションの既定の乱数発生器の設定は、ワーカーが同一マシンのローカル クラスターにある場合でも GPU の設定と同じです。つまり、MATLAB のクライアントとそのワーカーで既定の乱数発生器の設定が "異なります"。

GPU では 3 つの乱数発生器がサポートされています。結合多重再帰発生器が既定値です。広く使用されており、信頼性の高い業界標準の並列計算用発生器であるためです。次のコマンドは既定のシード 0 を使用し、GPU 乱数発生器を選択します。

gpurng(0,'CombRecursive')
gpurng(0,'Philox')
gpurng(0,'Threefry')

GPU での乱数発生についての詳細と、GPU と CPU での発生の比較は、乱数ストリームの制御を参照してください。複数の乱数発生器のパフォーマンスを比較する例については、「GPU での乱数の生成」を参照してください。

gpuArray の特性の調査

gpuArray オブジェクトの特性を調べるいくつかの関数があります。

関数説明
classUnderlying配列の基になるデータのクラス
existsOnGPU配列が GPU に存在してアクセス可能かどうかの指標
isreal配列データが実数かどうかの指標
lengthベクトルの長さまたは最大の配列次元
ndims配列における次元の数
size配列次元のサイズ

たとえば、gpuArray の G オブジェクトのサイズを調べるには、以下を入力します。

G = rand(100,'gpuArray');
s = size(G)
    100   100

参考

|