Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

gpuDevice

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

説明

GPUDevice オブジェクトはコンピューターのグラフィックス処理装置 (GPU) を表します。GPU を使用すると、gpuArray 変数をサポートする MATLAB® コードを実行することや、CUDAKernel オブジェクトを使用して CUDA カーネルを実行することができます。

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(indx) は、インデックス indx で指定された 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 として指定します。このプロパティは、現在の MATLAB セッションでデバイスが使用可能かどうかを示します。サポートされていないデバイス (DeviceSupported プロパティが 0) は、常に使用不可です。ComputeMode プロパティが 'Exclusive thread''Exclusive process''Prohibited' のいずれかに設定されているデバイスも、使用できない可能性があります。

このプロパティは読み取り専用です。

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

オブジェクト関数

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

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

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

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

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

methods('parallel.gpu.GPUDevice')

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

help parallel.gpu.GPUDevice.functionname

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

help parallel.gpu.GPUDevice.isAvailable

すべて折りたたむ

この例では、gpuDevice を使用して、使用するデバイスの識別と選択を行う方法を説明します。

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

gpuDeviceCount("available")
ans = 2

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

gpuDeviceTable
ans=2×5 table
    Index        Name         ComputeCapability    DeviceAvailable    DeviceSelected
    _____    _____________    _________________    _______________    ______________

      1      "TITAN RTX"            "7.5"               true              true      
      2      "Quadro K620"          "5.0"               true              false     

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

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

gpuDevice(2)
ans = 
  CUDADevice with properties:

                      Name: 'Quadro K620'
                     Index: 2
         ComputeCapability: '5.0'
            SupportsDouble: 1
             DriverVersion: 11
            ToolkitVersion: 10.2000
        MaxThreadsPerBlock: 1024
          MaxShmemPerBlock: 49152
        MaxThreadBlockSize: [1024 1024 64]
               MaxGridSize: [2.1475e+09 65535 65535]
                 SIMDWidth: 32
               TotalMemory: 2.1475e+09
           AvailableMemory: 1.6776e+09
       MultiprocessorCount: 3
              ClockRateKHz: 1124000
               ComputeMode: 'Default'
      GPUOverlapsTransfers: 1
    KernelExecutionTimeout: 1
          CanMapHostMemory: 1
           DeviceSupported: 1
           DeviceAvailable: 1
            DeviceSelected: 1

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

D = gpuDevice;

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

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

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

MATLAB で使用可能な GPU の数を特定するには、関数gpuDeviceCountを使用します。

availableGPUs = gpuDeviceCount("available")
availableGPUs = 3

使用可能な GPU と同数のワーカーをもつ並列プールを起動します。最良のパフォーマンスを得るために、MATLAB は既定でワーカーごとに別々の GPU を割り当てます。

parpool('local',availableGPUs);
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 3).

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

spmd
    gpuDevice
end

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

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

delete(gcp('nocreate'));

他の GPU を選択して使用する場合は、gpuDevice で GPU デバイス インデックスを使用して、各ワーカーで特定の GPU を選択できます。関数 gpuDeviceCount を使用すると、システム内の各 GPU デバイスのインデックスを取得できます。

システム内に使用可能な GPU が 3 つあり、その中の 2 つだけを計算に使用するとします。デバイスのインデックスを取得します。

[availableGPUs,gpuIndx] = gpuDeviceCount("available")
availableGPUs = 3
gpuIndx = 1×3

     1     2     3

使用するデバイスのインデックスを定義します。

useGPUs = [1 3];

並列プールを起動します。spmd ブロックと gpuDevice を使用して、各ワーカーと使用する GPU のいずれかをデバイス インデックスにより関連付けます。関数 labindex は各ワーカーのインデックスを識別します。

parpool('local',numel(useGPUs));
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 2).
spmd
    gpuDevice(useGPUs(labindex));
end

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

計算が完了したら、並列プールをシャットダウンします。

delete(gcp('nocreate'));

バージョン履歴

R2010b で導入