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

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

入力引数

すべて展開する

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

例: gpuDevice(1);

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

プロパティ

すべて展開する

ID

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

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

データ型: char

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

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

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

R2024a 以降

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

デバイスの汎用一意識別子 (UUID)。文字配列として指定します。

UUID は通常、'GPU-' で始まり、36 文字からなる 16 進数のシーケンスを含みます。UUID を使用すると、それ以外は同一の GPU を区別することができます。

データ型: char

状態

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

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

データ型: logical

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

使用可能なデバイスのフラグ。logical 値 0 (false) または 1 (true) として指定します。このプロパティは、現在の MATLAB セッションでデバイスが使用可能かどうかを示します。サポートされていないデバイス (DeviceSupported プロパティが 0 (false)) は、常に使用不可です。ComputeMode プロパティが 'Exclusive thread''Exclusive process''Prohibited' のいずれかに設定されているデバイスも、使用できない可能性があります。

データ型: logical

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

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

データ型: logical

R2024b 以降

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

現在の MATLAB セッションでデバイスに最後にアクセスした日時。スカラー datetime 配列として指定します。このセッションでデバイスにアクセスしていない場合、LastAccessed は Not-a-Time (NaT) です。

MATLAB で GPU デバイスを使用する操作の多くで、LastAccessed が更新されます。それには以下が含まれます。

  • gpuDevice を使用してデバイスを選択する。

  • reset を使用してデバイスをリセットする。

  • gpuArray を作成または使用する。

現在選択されているデバイスのプロパティのクエリでは LastAccessed は更新されません。

データ型: datetime

メモリ

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

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

データ型: double

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

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

データ型: double

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 オブジェクトのキャッシュ ポリシーを設定できません。

データ型: char | string

ドライバー

R2023a 以降

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

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

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

データ型: char

R2023a 以降

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

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

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

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

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

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

データ型: char

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

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

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

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

データ型: char

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

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

データ型: logical

機能

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

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

データ型: char

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

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

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

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

データ型: double

R2024b 以降

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

デバイス上の倍精度浮動小数点単位 (FPU) に対する単精度 FPU の比率。スカラー値として指定します。

この比率は、デバイスの倍精度の処理能力に対する単精度の処理能力を示します。線形計算の求解などの倍精度計算に適したデバイスでは、一般に比率が低くなります。深層ニューラル ネットワークの学習やグラフィックスのレンダリングなどの単精度計算に適したデバイスでは、一般に比率が高くなります。

データ型: double

カーネル プログラミング

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

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

例: 1024

データ型: double

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

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

データ型: double

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

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

例: [1024 1024 64]

データ型: double

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

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

例: [2.1475e+09 65535 65535]

データ型: double

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

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

データ型: double

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

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

データ型: double

オブジェクト関数

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

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

parallel.gpu.GPUDevice.isAvailable(ind)インデックス ind によって指定された GPU がサポートされていて選択可能な場合は、logical 1 または true を返します。ind は整数、または整数のベクトルで、既定のインデックスは現在のデバイスです。
parallel.gpu.GPUDevice.getDevice(ind)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              false     

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

MATLAB® で GPU を使用できることを確認するには、canUseGPU関数を使用します。この関数は、計算に使用できる GPU がある場合は 1 (true) を返し、ない場合は 0 (false) を返します。

canUseGPU
ans = logical
   1

canUseGPU0 (false) を返す場合などに GPU の設定に関する問題を診断するには、validateGPU関数を使用します。GPU の検証はオプションです。

validateGPU
# Beginning GPU validation
# Performing system validation
#    CUDA-supported platform .................................................PASSED
#    CUDA-enabled graphics driver exists .....................................PASSED
#        Version: 537.70
#    CUDA-enabled graphics driver load .......................................PASSED
#    CUDA environment variables ..............................................PASSED
#    CUDA device count .......................................................PASSED
#        Found 2 devices.
#    GPU libraries load ......................................................PASSED
# 
# Performing device validation for device index 1
#    Device exists ...........................................................PASSED
#        NVIDIA RTX A5000
#    Device supported ........................................................PASSED
#    Device available ........................................................PASSED
#        Device is in 'Default' compute mode.
#    Device selectable .......................................................PASSED
#    Device memory allocation ................................................PASSED
#    Device kernel launch ....................................................PASSED
# 
# Finished GPU validation with no failures.

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

gpuDevice(2)
ans = 
  CUDADevice with properties:

                 Name: 'Quadro P620'
                Index: 2 (of 2)
    ComputeCapability: '6.1'
          DriverModel: 'WDDM'
          TotalMemory: 2147352576 (2.15 GB)
      AvailableMemory: 1596066816 (1.60 GB)
      DeviceAvailable: true
       DeviceSelected: true

  Show all properties.

あるいは、利用できる 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 (of 2)
    ComputeCapability: '8.6'
          DriverModel: 'TCC'
          TotalMemory: 25544294400 (25.54 GB)
      AvailableMemory: 25120866304 (25.12 GB)
      DeviceAvailable: true
       DeviceSelected: true

  Show all properties.

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 で導入

すべて展開する