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 で使用するには、ComputeCapabilityGPU 計算の要件の必要な仕様を満たしていなければなりません。

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

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

R2023a 以降

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

GPU デバイスで現在使用されているグラフィックス ドライバーのバージョン。文字配列として指定します。

ご使用の GPU の最新のグラフィックス ドライバーを、NVIDIA Driver Downloads からダウンロードします。

R2023a 以降

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

グラフィックス ドライバーの動作モデル。次の値のいずれかとして指定します。

  • 'WDDM' – 表示動作モデルを使用します。

  • 'TCC' – 計算動作モデルを使用します。'TCC' では Windows® グラフィックスが無効にされ、大規模な計算のパフォーマンスが向上することがあります。

  • 'N/A''WDDM' および 'TCC' は Windows でのみ使用可能です。他のオペレーティング システムでは、ドライバー モデルは 'N/A' です。

モデルの変更や 'TCC' をサポートする GPU デバイスの詳細については、NVIDIA® のドキュメンテーションを参照してください。

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

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

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

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

例: 1024

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

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

例: 49152

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

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

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

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

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

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

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

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

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

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

R2023a 以降

GPU デバイスのキャッシュ ポリシー。'balanced''minimum'、または 'maximum' として指定します。計算を高速化するためにキャッシュできる GPU メモリの量を決定するキャッシュ ポリシー。次の値のいずれかとして指定します。

  • 'minimum' – GPU デバイスにキャッシュできるメモリの量は最小です。

  • 'balanced' – GPU デバイスにキャッシュできるメモリの量はバランスが取られます。このポリシーでは、GPU メモリ使用量と計算パフォーマンスのバランスが取られます。

  • 'maximum' – GPU デバイスにキャッシュできるメモリの量は、デバイスの合計メモリの量によってのみ制限されます。

既定値は 'balanced' ('Default' または 'Prohibited' 計算モードのデバイスの場合) または 'maximum' ('Exclusive process' 計算モードのデバイスの場合) です。計算モード プロパティの詳細については、ComputeMode を参照してください。

メモ

  • reset を使用してデバイスをリセットするか、gpuDevice([]) を使用してデバイスを消去するか、gpuDevice を使用して別のデバイスを選択すると、キャッシュ ポリシーが既定のポリシーにリセットされます。

  • GPUDevice オブジェクトが含まれている MAT ファイルを保存して読み込んでも、キャッシュ ポリシーは保持されません。

  • 選択されていないデバイスのキャッシュ ポリシーを設定することはできません。たとえば、最初の GPUDevice オブジェクトを配列に格納して別のデバイスを選択した後には、最初の GPUDevice オブジェクトのキャッシュ ポリシーを設定できません。

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

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

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

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

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

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

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

GPU デバイスの計算モードの変更の詳細については、NVIDIA のドキュメンテーションを参照してください。

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

転送のオーバーラップのサポート フラグ。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      "NVIDIA RTX A5000"          "8.6"               true              false     
      2      "Quadro P620"               "6.1"               true              true      

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

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

gpuDevice(2)
ans = 
  CUDADevice with properties:

                      Name: 'Quadro P620'
                     Index: 2
         ComputeCapability: '6.1'
            SupportsDouble: 1
     GraphicsDriverVersion: '511.79'
               DriverModel: 'WDDM'
            ToolkitVersion: 11.2000
        MaxThreadsPerBlock: 1024
          MaxShmemPerBlock: 49152 (49.15 KB)
        MaxThreadBlockSize: [1024 1024 64]
               MaxGridSize: [2.1475e+09 65535 65535]
                 SIMDWidth: 32
               TotalMemory: 2147287040 (2.15 GB)
           AvailableMemory: 1615209678 (1.62 GB)
               CachePolicy: 'balanced'
       MultiprocessorCount: 4
              ClockRateKHz: 0
               ComputeMode: 'Default'
      GPUOverlapsTransfers: 1
    KernelExecutionTimeout: 1
          CanMapHostMemory: 1
           DeviceSupported: 1
           DeviceAvailable: 1
            DeviceSelected: 1

あるいは、利用できる GPU デバイスの数を判別し、デバイスのプロパティのいくつかを検査して、MATLAB® デスクトップから使用するデバイスを選択することもできます。[ホーム] タブの [環境] 領域で、[並列][GPU 環境の選択] を選択します。

gpuDevice2.png

既定の GPU デバイスを表すオブジェクトを作成し、その計算能力をクエリします。

D = gpuDevice;
D.ComputeCapability
ans = 
'8.6'

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

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

gpuDeviceTableを使用してシステム内の GPU デバイスの計算能力および可用性を比較します。

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

      1      "NVIDIA RTX A5000"          "8.6"               true              false     
      2      "Quadro P620"               "6.1"               true              true      

GPU のキャッシュ ポリシーを変更します。

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

D = gpuDevice
D = 
  CUDADevice with properties:

                      Name: 'NVIDIA RTX A5000'
                     Index: 1
         ComputeCapability: '8.6'
            SupportsDouble: 1
     GraphicsDriverVersion: '511.79'
               DriverModel: 'TCC'
            ToolkitVersion: 11.2000
        MaxThreadsPerBlock: 1024
          MaxShmemPerBlock: 49152 (49.15 KB)
        MaxThreadBlockSize: [1024 1024 64]
               MaxGridSize: [2.1475e+09 65535 65535]
                 SIMDWidth: 32
               TotalMemory: 25553076224 (25.55 GB)
           AvailableMemory: 25145376768 (25.15 GB)
               CachePolicy: 'balanced'
       MultiprocessorCount: 64
              ClockRateKHz: 0
               ComputeMode: 'Default'
      GPUOverlapsTransfers: 1
    KernelExecutionTimeout: 0
          CanMapHostMemory: 1
           DeviceSupported: 1
           DeviceAvailable: 1
            DeviceSelected: 1

GPU デバイスの CachePolicy プロパティにアクセスします。

D.CachePolicy
ans = 
'balanced'

キャッシュ ポリシーを変更して、GPU で計算を高速化するためにメモリの最大量をキャッシュできるようにします。

D.CachePolicy = "maximum";
D.CachePolicy
ans = 
'maximum'

プロパティを [] に設定して、キャッシュ ポリシーを既定のポリシーにリセットします。

D.CachePolicy = [];

reset(D) を呼び出すか、gpuDevice で別のデバイスを選択した場合も、キャッシュ ポリシーは既定値にリセットされます。

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

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

availableGPUs = gpuDeviceCount("available")
availableGPUs = 3

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

parpool('Processes',availableGPUs);
Starting parallel pool (parpool) using the 'Processes' 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 のいずれかをデバイス インデックスにより関連付けます。関数 spmdIndex は各ワーカーのインデックスを識別します。

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

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

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

delete(gcp('nocreate'));

バージョン履歴

R2010b で導入

すべて展開する