Gpuパフォ,マンスの測定と向上
Gpuパフォ,マンスの測定
Gpuでのコ,ドのパフォ,マンスの測定
コ,ドのパフォ,マンスの重要な測定項目に実行時間があります。Gpuでのコ,ドの実行時間を測定する最良の方法は,関数gputimeit
を使用することです。この関数を使用すると,関数を複数回実行することで変動が平均化され,オ,バ,ヘッドが補正されます。また,関数gputimeit
では,必ずgpuでのすべての演算が完了してから時間が記録されます。
たとえば,サN
行N
列の乱数行列一个
の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 |
個々の関数の時間測定 |
|
抽搐 およびtoc |
複数のコ,ド行やワ,クフロ,全体の時間測定 |
|
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で実行する |
全般に適用可能 | 関数が |
Matlabコドのプロファリングと改善—コドをプロファリングしてボトルネックを特定する |
全般に適用可能 | Gpuでのコ,ドのパフォ,マンスの測定セクションで説明したように,プロファイラーはGPUでのコードの実行時間の正確な測定には使用できません。 |
計算のベクトル化—用于ル、プを行列演算とベクトル演算に置き換える |
ル、プ内でベクトルまたは行列の演算を行うコ、ドを実行する場合 | 詳細にいては,ベクトル化の使用を参照してください。 |
単精度での計算の実行—使用するデタの精度を下げて計算を少なくする |
値の範囲の縮小や精度の低下を許容できる場合 | 線形代数問題などの一部の種類の計算には,倍精度の処理が必要な場合があります。 |
|
|
サポトされている関数と他の制限の詳細にいては, |
|
多数の小さな行列に対して独立した行列演算を実行する関数を使用する場合 | すべての組み込みのmatlab関数がサポ,トされているわけではありません。サポトされている関数と他の制限の詳細にいては, |
Cudaコドを含むmexファルの記述- gpu関数の追加ラeconpブラリにアクセスする |
英伟达®のラaapl . exeブラリやcudaの高度な機能にアクセスする場合 | Cuda c++フレ,ムワ,クを使用して記述されたコ,ドが必要です。 |
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で実行される関数をベクトル化することでパフォーマンスがどれくらい向上するかを示しています。
単精度での計算の実行
倍精度の代わりに単精度で計算を実行することにより,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
を使用します。
参考
gpuDevice
|gputimeit
|抽搐
|toc
|gpuArray
|arrayfun
|pagefun
|mexcuda