ドキュメンテーション

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

gpuDevice

GPU デバイスのクエリまたは選択

説明

GPUDevice オブジェクトはコンピューターのグラフィックス処理装置 (GPU) を表します。GPU を使用して CUDA カーネルまたは MATLAB コードを実行できます。

GPUDevice オブジェクトを使用して GPU デバイスのプロパティの検査、GPU デバイスのリセット、または GPU の計算が完了するまでの待機ができます。GPUDevice オブジェクトを取得するには、関数 gpuDevice を使用します。関数 gpuDevice を使用して GPU デバイスの選択または選択解除もできます。複数の GPU にアクセスできる場合、関数 gpuDevice を使用して、コードを実行する特定の GPU デバイスを選択します。

GPU 上で関数を実行するために GPUDevice オブジェクトを使用する必要はありません。GPU 対応関数の使用方法の詳細については、GPU での MATLAB 関数の実行を参照してください。

作成

説明

gpuDevice は、現在選択されている GPU デバイスのプロパティを表示します。現在デバイスが選択されていない場合、gpuDevice は、既定のデバイスをクリアせずに選択します。GPU デバイスのプロパティを検査するときに、この構文を使用します。

D = gpuDevice は、現在選択されているデバイスを表す GPUDevice オブジェクトを返します。現在デバイスが選択されていない場合、gpuDevice は既定のデバイスを選択し、そのデバイスを表す GPUDevice オブジェクトをクリアせずに返します。

D = gpuDevice(IDX) はインデックス IDX で指定された GPU デバイスを選択します。指定された GPU デバイスがサポートされていない場合、エラーが発生します。この構文は、デバイスが現在既に選択されている場合でも、指定されたデバイスをリセットし、そのメモリをクリアします (関数 reset と等価)。gpuArray または CUDAKernel の変数を表すすべてのワークスペース変数が無効になるため、これらの変数をワークスペースからクリアするか、再定義しなければなりません。

gpuDevice([]) に空の引数が指定されると (引数がない場合とは異なる)、GPU デバイスの選択を解除し、メモリから gpuArrayCUDAKernel の変数をクリアします。この構文では、現在のデバイスとして選択されている GPU デバイスがなくなります。

入力引数

すべて展開する

GPU デバイスのインデックス。1 からgpuDeviceCountまでの範囲の整数として指定します。

例: gpuDevice(1);

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

プロパティ

すべて展開する

GPU デバイスの名前。文字配列として指定します。デバイスに割り当てられる名前は、GPU デバイス モデルから派生します。

GPU デバイスのインデックス。1 からgpuDeviceCountまでの範囲の整数として指定します。このインデックスを使用して、特定の GPU デバイスを選択します。

GPU デバイスの計算能力。文字配列として指定します。選択した GPU デバイスを MATLAB® で使用するには、ComputeCapabilityリリース別の GPU サポートの必要な仕様を満たしていなければなりません。

倍精度演算のサポート。false の場合は 0true の場合は 1 の logical 値として指定します。

現在使用している GPU デバイス ドライバーのバージョン。スカラー値として指定します。選択した GPU デバイスを MATLAB で使用するには、DriverVersionリリース別の GPU サポートの必要な仕様を満たしていなければなりません。

現在の MATLAB リリースで使用されている CUDA ツールキットのバージョン。スカラー値として指定します。

CUDAKernel の実行中にサポートされる最大スレッド数/ブロック。スカラー値として指定します。

例: 1024

CUDAKernel の実行中にスレッド ブロックが使用可能な、サポートされる共有メモリの最大量。スカラー値として指定します。

例: 49152

スレッド ブロックの各次元の最大サイズ。ベクトルとして指定します。スレッド ブロックの各次元はこれらの次元サイズを超えてはなりません。また、スレッド ブロック サイズの積は MaxThreadsPerBlock を超えてはなりません。

スレッド ブロックのグリッドの最大サイズ。ベクトルとして指定します。

同時に実行されるスレッドの数。スカラー値として指定します。

デバイス上の合計メモリ (バイト単位)。スカラー値として指定します。

データに使用可能な合計メモリ (バイト単位)。スカラー値として指定します。このプロパティは現在選択されているデバイスに対してのみ使用可能です。メモリのキャッシュにより、この値は NVIDIA® System Management Interface で報告される値と異なる場合があります。

デバイス上に存在し、ストリーミングを行うマルチプロセッサの数。スカラー値として指定します。

GPU のピーク クロック レート (kHz 単位)。スカラー値として指定します。

デバイスの計算モード。次の値のいずれかとして指定します。

'Default'このデバイスは制限を受けず、複数のアプリケーションで同時に使用できます。MATLAB は他の MATLAB セッションやワーカーなど、他のアプリケーションとデバイスを共有できます。
'Exclusive thread' または 'Exclusive process'このデバイスは一度に 1 つのアプリケーションのみで使用できます。このデバイスが MATLAB で選択されている間は、他の MATLAB セッション、ワーカーなどの他のアプリケーションでこのデバイスを使用できません。
'Prohibited'このデバイスは使用できません。

転送のオーバーラップのサポート。logical 値 0 または 1 として指定します。

長時間実行されているカーネルのタイムアウト。logical 値 0 または 1 として指定します。1 の場合は、オペレーティング システムによって CUDA カーネルを実行できる時間に上限が設定されます。この時間を過ぎると、CUDA ドライバーによりカーネルがタイムアウトし、エラーが返されます。

ホスト メモリの CUDA アドレス空間へのマッピングのサポート。logical 値 0 または 1 として指定します。

サポートされているデバイス。logical 値 0 または 1 として指定します。ComputeCapability が不十分なデバイスなど、サポートされないデバイスもあります。

現在選択されているデバイス。logical 値 0 または 1 として指定します。

オブジェクト関数

次の関数を使用して、GPU デバイスの識別、選択、リセットまたは待機を行うことができます。

gpuDeviceCount存在する GPU デバイスの数
resetGPU デバイスをリセットし、そのメモリを消去する
wait (GPUDevice)GPU の計算が完了するまで待機

次の関数も使用できます。

parallel.gpu.GPUDevice.isAvailable(idx)インデックス idx で指定された GPU がサポートされていて選択可能な場合は、true を返します。idx は整数、または整数のベクトルで、既定のインデックスは現在のデバイスです。
parallel.gpu.GPUDevice.getDevice(idx)GPUDevice オブジェクトを選択せずに返します。

関数の完全な一覧については、GPUDevice オブジェクトに対して関数 methods を使用してください。

methods('parallel.gpu.GPUDevice')

次のコマンドを使用して、任意のオブジェクト関数のヘルプを取得できます。

help parallel.gpu.GPUDevice.functionname

ここで、functionname は関数の名前です。たとえば、isAvailable のヘルプを表示するには、次を入力します。

help parallel.gpu.GPUDevice.isAvailable

すべて折りたたむ

お使いのコンピューターで利用できる GPU デバイスの数を確認するには、関数gpuDeviceCountを使用します。

gpuDeviceCount
    2

デバイスが複数ある場合は、1 番目のデバイスが既定になります。gpuDevice 関数でそのプロパティを調べて、使用する目的のデバイスかどうかを判断することができます。

d = gpuDevice
d =

  CUDADevice with properties:

                      Name: 'GeForce GTX 1080'
                     Index: 1
         ComputeCapability: '6.1'
            SupportsDouble: 1
             DriverVersion: 10
            ToolkitVersion: 10
        MaxThreadsPerBlock: 1024
          MaxShmemPerBlock: 49152
        MaxThreadBlockSize: [1024 1024 64]
               MaxGridSize: [2.1475e+09 65535 65535]
                 SIMDWidth: 32
               TotalMemory: 8.5899e+09
           AvailableMemory: 7.0053e+09
       MultiprocessorCount: 20
              ClockRateKHz: 1733500
               ComputeMode: 'Default'
      GPUOverlapsTransfers: 1
    KernelExecutionTimeout: 1
          CanMapHostMemory: 1
           DeviceSupported: 1
            DeviceSelected: 1

d が使用する目的のデバイスである場合は、次に進むことができます。GPU 上で計算を実行するには、gpuArray 対応関数を使用します。詳細については、GPU での MATLAB 関数の実行を参照してください。

他のデバイスを使用するには、そのデバイスのインデックスを指定して gpuDevice を呼び出します。

gpuDevice(2)

既定の GPU デバイスを表すオブジェクトを作成します。

g = gpuDevice;

使用可能なすべての GPU デバイスの計算能力をクエリします。

for ii = 1:gpuDeviceCount
    g = gpuDevice(ii);
    fprintf(1,'Device %i has ComputeCapability %s \n', ...
            g.Index,g.ComputeCapability)
end
Device 1 has ComputeCapability 3.5
Device 2 has ComputeCapability 2.0

複数の GPU にアクセスできる場合、並列プールを使用して複数の GPU で並列計算を実行することができます。

GPU と同数のワーカーをもつ並列プールを開始します。利用可能な GPU の数を調べるには、関数gpuDeviceCountを使用します。既定で、MATLAB は最大のパフォーマンスを得るために各ワーカーに異なる GPU を割り当てます。

parpool('local',gpuDeviceCount);

各ワーカーが使用している GPU を識別するために、spmd ブロック内で gpuDevice を呼び出します。spmd ブロックは各ワーカーで gpuDevice を実行します。

spmd
    gpuDevice
end

parforparfeval などの並列言語機能を使用して、並列プールのワーカーに計算を分散します。計算に gpuArray 対応関数を使用すると、これらの関数はワーカーの GPU で実行されます。詳細については、GPU での MATLAB 関数の実行を参照してください。例は、複数の GPU での MATLAB 関数の実行を参照してください。

計算が完了したら、並列プールをシャットダウンします。関数 gcp を使用して、現在の並列プールを取得できます。

delete(gcp('nocreate'));

他の GPU を選択して使用する場合、gpuDevice を使用して各ワーカー上の特定の GPU を選択できます。各ワーカーで有効にする GPU のインデックスを含む配列 (gpuIndices など) を定義します。次に、選択する GPU と同じ数のワーカーをもつ並列プールを起動し、spmd ブロックを使用して各ワーカーで gpuDevice を実行します。関数 labindex が各ワーカーを識別します。この関数を使用してワーカーを GPU インデックスと関連付けます。

gpuIndices = [1 3];
parpool(numel(gpuIndices));
spmd
    gpuDevice(gpuIndices(labindex));
end

ベスト プラクティスとして、また最良のパフォーマンスを得るには、各ワーカーに異なる GPU を割り当てます。

R2010b で導入