主要内容

Gpuパフォ,マンスの測定と向上

Gpuパフォ,マンスの測定

Gpuでのコ,ドのパフォ,マンスの測定

コ,ドのパフォ,マンスの重要な測定項目に実行時間があります。Gpuでのコ,ドの実行時間を測定する最良の方法は,関数gputimeitを使用することです。この関数を使用すると,関数を複数回実行することで変動が平均化され,オ,バ,ヘッドが補正されます。また,関数gputimeitでは,必ずgpuでのすべての演算が完了してから時間が記録されます。

たとえば,サNN列の乱数行列一个のlu分解を関数で計算するのにかかる時間を測定します。この測定を実行するには,関数の関数ハンドルを作成し,その関数ハンドルをgputimeitに渡します。

N = 1000;A = rand(N,“gpuArray”);f = @() lu(A);numOutputs = 2;numOutputs gputimeit (f)

コ,ドの時間の測定には,抽搐tocも使用できます。ただし,抽搐tocの場合,GPUでのコードの実行時間の正確な情報を取得するには,演算が完了するまで待ってから呼び出さなければなりません。これを行うには,gpuDeviceオブジェクトを入力として指定して関数等待を使用します。たとえば,抽搐toc,および等待を使用して,行列一个のlu分解の計算時間を測定します。

D = gpuDevice;wait(D) tic [L,U] = lu(A);等待(D) toc

コ,ドの各部分の所要時間は,matlab®プロファ▪▪ラ▪▪を使用して確認できます。コドのプロファリングの詳細にいては,配置文件およびパフォマンス向上のためのコドのプロファリングを参照してください。プロファイラーはコードのパフォーマンスのボトルネックを特定するのに便利ですが,GPUの使用時に一般に発生するオーバーラップ実行については考慮されないため,GPUコードの正確な時間は測定できません。

次の表を参考に,使用する時間測定方法を決めてください。

時間測定方法 適したタスク 制限
gputimeit 個々の関数の時間測定
  • 関数gputimeitには引数として関数ハンドルが必要であるため,この方法は単一の関数の時間測定にしか使用できません。ただし,時間を測定する関数に他の関数の呼び出しが含まれていてもかまいません。

  • 関数gputimeitは初期化のオーバーヘッドを考慮して関数を複数回実行するため,多くの場合,この方法は実行時間の長い関数の時間測定には適しません。

抽搐およびtoc 複数のコ,ド行やワ,クフロ,全体の時間測定
  • すべてのgpu計算が確実に完了するように,tocを呼び出す前に等待を呼び出さなければなりません。同様に,前のコ,ドがgpuで実行中の場合,抽搐を呼び出す前に等待を呼び出さなければなりません。

  • 抽搐tocを使用してgputimeitの実行時間を測定することはできません。

Matlabプロファ转换器ラ パフォ,マンスのボトルネックの特定

プロファイラーでは各コード行が個別に実行され,GPUの使用時に一般に発生するオーバーラップ実行については考慮されません。プロファ@ @プロファ@ @ラ@ @はgpuコ@ @ @ドの正確な時間を測定する方法としては使用できません。

Gpuのベンチマ,ク

GPUの強みと弱みの特定や各種GPUのパフォーマンスの比較には,ベンチマークテストが便利です。次のベンチマクテストを使用してgpuのパフォマンスを測定します。

  • 倍精度の行列計算について,PCIバスの速度,GPUメモリの読み取り/書き込み,ピーク計算のパフォーマンスなど,GPUに関する詳細な情報を取得するには,Gpuパフォ,マンスの測定の例を実行します。

  • 単精度と倍精度でメモリ使用量や計算量が多いタスクをテストするには,gpuBenchを使用します。gpuBenchは,アドオンエクスプローラーまたはMATLAB中央文件交换からダウンロードできます。詳細にいては,//www.tianjin-qmedu.com/matlabcentral/fileexchange/34080-gpubenchを参照してください。

Gpuパフォ,マンスの改善

Matlabのgpu計算の目的は,コ,ドの高速化です。コードの記述やGPUハードウェアの構成に関するベストプラクティスを実装することで,GPUでのパフォーマンスを改善できます。パフォ,マンスを改善するためのさまざまな方法を以下に示します。実装が簡単なものから順番に示してあります。

次の表を参考に,使用する方法を決めてください。

パフォ,マンス改善方法 この方法を使用する状況 制限

Gpu配列の使用—サポトされる関数にgpu配列を渡してコドをgpuで実行する

全般に適用可能

関数がgpuArrayの入力をサポ,トしていなければなりません。gpuArrayの入力をサポトするmatlab関数のリストにいては,Gpuでのmatlab関数の実行を参照してください。

Matlabコドのプロファリングと改善—コドをプロファリングしてボトルネックを特定する

全般に適用可能

Gpuでのコ,ドのパフォ,マンスの測定セクションで説明したように,プロファイラーはGPUでのコードの実行時間の正確な測定には使用できません。

計算のベクトル化—用于ル、プを行列演算とベクトル演算に置き換える

ル、プ内でベクトルまたは行列の演算を行うコ、ドを実行する場合

詳細にいては,ベクトル化の使用を参照してください。

単精度での計算の実行—使用するデタの精度を下げて計算を少なくする

値の範囲の縮小や精度の低下を許容できる場合

線形代数問題などの一部の種類の計算には,倍精度の処理が必要な場合があります。

arrayfunの使用-カスタムcuda®カ,ネルを使用して要素単位の関数を実行する

  • 要素単位の演算を多数実行する関数を使用する場合

  • 入れ子関数から親関数で宣言された変数にアクセスする必要がある場合

  • 入出力配列 (重塑など)のサ。

  • すべての組み込みのmatlab関数がサポ,トされているわけではありません。

サポトされている関数と他の制限の詳細にいては,arrayfunを参照してください。

pagefunの使用-行列演算の大規模なバッチを単一の呼び出しで実行する

多数の小さな行列に対して独立した行列演算を実行する関数を使用する場合

すべての組み込みのmatlab関数がサポ,トされているわけではありません。サポトされている関数と他の制限の詳細にいては,pagefunを参照してください。

Cudaコドを含むmexファルの記述- gpu関数の追加ラeconpブラリにアクセスする

英伟达®のラaapl . exeブラリやcudaの高度な機能にアクセスする場合 Cuda c++フレ,ムワ,クを使用して記述されたコ,ドが必要です。

Gpuパフォ,マンスのためのハ,ドウェアの構成—ハドウェアを最適に利用する

全般に適用可能
  • 英伟达のすべてのGPUデバイスで太极拳モードがサポートされているわけではありません。

  • TCCモ,ドのgpuデバ,スは計算にのみ使用され,表示用の出力は提供されません。

Gpu配列の使用

コ,ドで使用しているすべての関数がgpuでサポ,トされている場合,必要な変更はgpuArrayを呼び出して入力デタをgpuに転送することだけです。gpuArrayの入力をサポトするmatlab関数のリストにいては,Gpuでのmatlab関数の実行を参照してください。

Gpuメモリのデ,タはgpuArrayオブジェクトに格納されます。MATLABおよび他の多くのツールボックスに含まれているほとんどの数値関数がgpuArrayオブジェクトをサポ,トしているため,通常は最小限の変更でコ,ドをgpuで実行できます。これらの関数はgpuArray入力を受け取り,gpuで計算を実行してgpuArray出力を返します。一般に,これらの関数はCPUで実行される標準のMATLAB関数と同じ引数とデータ型をサポートしています。

ヒント

オ,バ,ヘッドを減らすには,ホストメモリとgpu,の間でのデ,タ転送の回数を制限します。可能であれば配列をgpuで直接作成します。詳細にいては,Gpu配列の直接作成を参照してください。デ,タを表示または保存する必要がある場合やgpuArrayオブジェクトをサポ,トしていないコ,ドで使用する必要がある場合も,同じように收集を使用してgpuからホストメモリにデ,タを再度転送するだけです。

MATLABコドのプロファリングと改善

MATLABコードを変換してGPUで実行できるようにする場合,最初は既に高いパフォーマンスを実現しているMATLABコードを使用するのが最善です。CPUで適切に動作するコードを記述するためのガイドラインの多くは,GPUで実行されるコードのパフォーマンスの改善にも役立ちます。CPUコドはmatlabプロファラを使用してプロファリングできます。CPUで長い時間を要するコド行にいては,改善が必要である可能性があります。gpuArrayオブジェクトを使用してgpuに移行することも検討してください。コドのプロファリングの詳細にいては,パフォマンス向上のためのコドのプロファリングを参照してください。

MATLABプロファイラーでは各コード行が個別に実行されるため,GPUの使用時に一般に発生するオーバーラップ実行については考慮されません。アルゴリズム全体の時間の測定には,Gpuでのコ,ドのパフォ,マンスの測定セクションで説明したように抽搐toc,またはgputimeitを使用してください。

計算のベクトル化

GPUでは複数の結果を並列に計算するとパフォーマンスが向上するため,一般にGPUではベクトル演算,行列演算,および高次元演算の方がスカラー演算よりもはるかにパフォーマンスが高くなります。高次元演算を使用するようにル,プを書き換えると,パフォ,マンスが高まります。ループベースでスカラー指向のコードを,MATLAB行列およびベクトル演算を使用するように変更するプロセスは“ベクトル化”と呼ばれます。ベクトル化の詳細にいては,ベクトル化の使用およびGpuとベクトル化された計算を使用したパフォ,マンスの改善を参照してください。Gpuとベクトル化された計算を使用したパフォ,マンスの改善の例にある次のプロットは,CPUとGPUで実行される関数をベクトル化することでパフォーマンスがどれくらい向上するかを示しています。

柱状图显示,通过向量化计算,CPU和GPU执行的函数执行时间显著减少。

単精度での計算の実行

倍精度の代わりに単精度で計算を実行することにより,GPUで実行されるコードのパフォーマンスを改善できます。CPU計算では、倍精度から単精度に切り替えてもこの向上は見られません。これは,ほとんどのGPUカードが,高い単精度のパフォーマンスを要求するグラフィックス表示用に設計されているためです。デタの単精度への変換と単精度デタでの算術演算の実行の詳細にいては,浮動小数点数を参照してください。

图形处理器での単精度計算に適する代表的なワ,クフロ,の例には,屏显器,屏显器。ただし,線形代数問題などの他の種類の計算には,一般に倍精度の処理が必要です。深度学习工具箱™の多くの演算は,既定では単精度で実行されます。詳細にいては,深度学习精度(深度学习工具箱)を参照してください。

パフォ,マンスの実際の向上は,gpuカ,ドおよび合計コア数に左右されます。ハ。単精度と倍精度の処理能力を含むNVIDIA GPUカードの総合的なパフォーマンスの概要については,https://en.wikipedia.org/wiki/List_of_Nvidia_graphics_processing_unitsを参照してください。

要素単位関数のパフォ,マンスの改善

要素単位の関数がある場合,その関数をarrayfunで呼び出すとパフォ,マンスを改善できることがよくあります。Gpuの関数arrayfunを使って要素単位のMATLAB関数をカスタムCUDAカーネルに変換すると,処理実行のオーバーヘッドを削減できます。多くの場合,コ,ド全体がarrayfunでサポ,トされていなくても,コ,ドのサブセットでarrayfunを使用できます。arrayfunを使用すると,ループや分岐のコード内で要素単位の演算を多数実行する関数,入れ子関数から親関数で宣言された変数にアクセスする入れ子にされた関数など,さまざまな要素単位の関数のパフォーマンスを改善できます。

arrayfunを使用した,要素単位のMATLAB関数のGPUにおけるパフォ,マンス改善では,arrayfunの基本的な適用例を示します。モンテカルロシミュレ,ションでのGPU arrayfunの使用では,ル,プ内で要素単位の演算を実行する関数のパフォ,マンスをarrayfunを使用して改善する例を示します。Gpuでのステンシル演算では,親関数で宣言された変数にアクセスする入れ子関数をarrayfunを使用して呼び出す例を示します。

小さな行列に対する演算のパフォ,マンスの改善

多数の小さな行列に対して独立した行列演算を実行する関数がある場合,その関数をpagefunで呼び出すとパフォ,マンスを改善できます。pagefunを使用すると,行列をル,プ処理する代わりに,行列演算をgpuで並列実行できます。pagefunによるGPU上の小さな行列問題のパフォ,マンス改善の例は,多数の小さな行列に対して演算を行う場合にpagefunを使用してパフォ,マンスを改善する方法を示しています。

Cudaコドを含むmexファルの記述

MATLABにはGPU対応関数の広範なライブラリが用意されていますが,MATLABに類似するものがない追加関数のライブラリにもアクセスできます。例としては、NVIDIA Performance Primitives (NPP)、cuRAND、cuFFT ライブラリなどの NVIDIA ライブラリがあります。CUDA C++ フレームワークで記述した MEX ファイルを関数mexcudaを使用してコンパ@ @ルできます。コンパイルした墨西哥人ファイルをMATLABで実行し,NVIDIAライブラリから関数を呼び出すことができます。gpuArray入力を受け取ってgpuArray出力を返すmex関数を記述して実行する方法の例にいては,Cudaコ,ドを含む,mex関数の実行を参照してください。

Gpuパフォ,マンスのためのハ,ドウェアの構成

多くの計算は大量のメモリを必要とし,ほとんどのシステムではグラフィックスに絶えずGPUを使用するため,通常,計算とグラフィックスに同じGPUを使用することは現実的でありません。

窗户®システムには,gpuデバ,cpuスのモ,cpuドが2種類あります。WDDM (Windows显示驱动程序模型)モ,ドまたはTCC (Tesla计算集群)モ,ドです。コドのパフォマンスを最適にするには,計算に使用するデバスをTCCモドに設定します。モードの切り替えや太极拳モードをサポートするGPUデバイスの詳細については,NVIDIAのドキュメンテーションを参照してください。

GPUのメモリが不足する可能性を低減するため,1つのGPUをMATLABの複数のインスタンスで使用しないでください。使用可能なgpuデバaapl . exeスと選択されているgpuデバaapl . exeスを確認するには,関数gpuDeviceTableを使用します。

参考

|||||||

関連するトピック