|
コンピューティングパワー需要の爆発的な増加を背景に、既存ハードウェアのコンピューティングパワーを最大限に活用することが不可欠になっています。簡単に言えば、既存のアルゴリズムを特定のプロセッサ向けに極限まで最適化し、現在のAIアルゴリズムの高いコンピューティングパワー要件を可能な限り満たす必要があります。 究極のパフォーマンス最適化を実現するには、次のアプローチが可能です。
プログラムを最適化するプロセスで解決すべき最初の問題は、プログラムがプロセッサの計算能力をどれだけ利用しているかを評価する方法と、さらにどのような最適化の余地と方向性があるかということです。 プロセッサをより深く理解するために、MegEngine チームは MegPeak と呼ばれるプロセッサ デバッグ ツールを開発しました。 このツールは主に、開発者のパフォーマンス評価と開発ガイダンスを支援するために使用されます。プロジェクトコードは現在完全にオープンソース化されており、ご興味のある方はご覧いただけます。 GitHub: https://github.com/MegEngine/MegPeak このツールの機能とプロジェクトの技術的な実装の詳細を簡単に見てみましょう。 MegPeakの紹介MegPeak を使用すると、ユーザーはターゲット プロセッサをテストできます。
上記の情報の一部は、チップのデータシートを参照し、理論計算と組み合わせることで取得できますが、対象プロセッサの詳細なパフォーマンスドキュメントを入手することは多くの場合不可能です。さらに、MegPeakを使用した測定はより直接的かつ正確であり、特定の命令の組み合わせにおけるピーク帯域幅をテストできます。 MegPeakの使い方使用方法については、MegPeak の Readme ドキュメントを参照してください。 https://github.com/MegEngine/MegPeak#build MegPeakの使用例ArmV8 の汎用命令のピークパフォーマンスとレイテンシをテストするには、コンパイル後にターゲットプロセッサで `megpeak` を実行して、次の結果を取得します。 上図に示すように、MegPeakはCPU上の各命令のピーク計算時間とレイテンシを正確にテストできます。OpenCLでは、異なるデータ型のローカルメモリとグローバルメモリへのアクセス帯域幅、および異なるint/floatデータ型のピーク計算時間をテストします。 これらの値は、プログラムの現在のパフォーマンスを評価し、ルーフラインをプロットする際に効果的に役立ちます。これにより、メモリアクセスや計算など、プログラムをブロックする主な要因を診断するのに役立ちます。具体的な分析方法については後ほど紹介します。 MegPeakの原理MegPeak テストの主なパラメータは次のとおりです。
MegPeak がこれらのパフォーマンス データをテストし、データシートのデータと可能な限り一致するようにする方法を理解するには、読者は次の CPU パイプライン関連の詳細を理解する必要があります。 プロセッサパイプライン命令スループットを向上させるため、現代のプロセッサは命令パイプラインを導入しています。命令パイプラインは、命令の実行プロセスを複数のステージに分割できます。典型的な5ステージパイプラインは、命令フェッチ、命令変換、命令実行、レジスタアクセス、データライトバックで構成されます。 これらの5つのステージは、プロセッサ内の物理ユニットによって独立して実行されます。したがって、理想的には、各ステージの各物理ユニットは、対応する演算を1クロックサイクルごとに1回実行でき、パイプラインを形成します。これにより、プロセッサは1クロックサイクルごとに1つの命令の実行を完了できます。 下の表に示すように、5 番目のクロック サイクルから、クロック サイクルごとに 1 つの命令が実行されます。 しかし、実際の実行においては、パイプラインがいつまでもスムーズに動作し続けることはできず、パイプラインが詰まるなど、以下のようなリスクが発生する可能性があります。
MegPeakは、命令間のデータハザードを制御し、構造的および制御的ハザードを最小限に抑えることで、プロセッサ命令のピーク計算とレイテンシを測定します。MegPeakではプロセッサのデータハザードを制御するためのコードを記述する必要があるため、MegPeakのテストにおけるコアコードはアセンブリ言語で実装されており、コンパイラの最適化による干渉を排除しています。 テストコマンドピークプロセッサ命令の計算ピークを測定するには、その命令を繰り返し実行しながらもリスクを一切負わないコードを書く必要があります。そのため、データリスクと制御リスクの両方を制御するコードが必要になります。
以下は、Arm64 上で fmla 命令のピーク値計算をテストする MegPeak のコア コードです。 静的int fmla_throughput() {上記のインライン アセンブリ コードは主に次の処理を実行します。
ここで説明が必要な問題があります。なぜ 20 個のレジスタを選択するのでしょうか?
上記のコードを実行することで、実行時間を測定できます。また、命令数とループ回数から実際の計算負荷を事前に計算できるため、命令のピーク時の計算負荷を算出することもできます。 テストコマンドの遅延プロセッサ命令の実行レイテンシを測定するには、繰り返し実行される命令を記述し、これらの命令間に厳密なデータ ハザード ルールがあることを確認しながら、他のハザードを最小限に抑える必要があります。
以下は、Arm64 上の fmla 命令のレイテンシをテストする MegPeak のコア コードです。 静的int fmla_latency() {上記のインラインアセンブリコードには主に以下が含まれます fmla v0.4s、v0.4s、v0.4s\n この命令は 20 回繰り返されるため、各命令は前の命令の計算結果に依存し、厳密なデータ依存性が生じます。 コードを実行し、実行時間を追跡することで、実行された命令の数に基づいて各命令の最終的なレイテンシを計算できます。 上記のコードは MegPeak で実装されていますが、それほど直接的ではなく、代わりにマクロを使用してコードを生成します。 MegPeakで測定したデータは何に利用できますか?MegPeak は、プロセッサのメモリ帯域幅、理論上のピーク命令計算、命令のレイテンシなどの情報をテストできるため、次のことが可能になります。
さらに、MegPeakは理論検証も提供します。例えば、プロセッサ周波数、1コアあたり1サイクルあたりの命令発行数、実行命令あたりの計算量を用いて理論上のピーク演算を算出し、MegPeakを用いて実測することで検証することができます。 図面指示に関連するルーフラインモデルルーフラインモデルは高性能コンピューティングで広く利用されており、アルゴリズムの最適化可能性と最適化方向を評価するための重要なツールです。MegPeakを使用すると、様々な命令に対してより詳細なルーフラインモデルを描画できます。例えば、CPUでは、異なるデータ型のメモリアクセス帯域幅はほぼ同じでも、ピーク時の計算コストは大きく異なる場合があります。例えば、ARMプロセッサにおけるfloat型のピーク時の計算コストは、int8型のそれと大きく異なります。 コード最適化の可能性を評価する特定のアルゴリズムを最適化する際に、MegPeak を使用することで、カーネル内の主要命令の最大ピーク値をテストできます。例えば、Arm 上の fp32 Matmul を最適化する場合、主に使用される命令は fmla 命令です。このとき、実際のプログラム実行時のピーク値をテストできます。命令のピーク値とプログラムのピーク値の差が小さいほど、コードの最適化が優れているといえます。 さらに、アルゴリズムの実装に基づいて計算コストとメモリアクセスコストを計算し、MegPeakを使用して上記のルーフラインをプロットすることができます。実際の計算密度を計算し、それをルーフラインにマッピングすることで、計算密度が図の緑色の領域に収まる場合、プログラムはメモリアクセスのさらなる最適化を必要としており、ブロック分割やデータの事前パック化など、より適切なメモリアクセスモデルを提供する必要があることが示されます。計算密度が灰色の領域に収まる場合、コードは既に最適化されていることを意味します。さらなる速度向上が必要な場合は、畳み込みにFFTやWinogradアルゴリズムを使用するなど、アルゴリズムの観点からの最適化が必要です。 最適な命令の組み合わせを探る多くのカーネル最適化は単一の命令では測定できず、カーネル全体の計算を表現するために複数の命令の組み合わせが必要になる場合があります。そのため、最適なプロセッサ性能を実現するために、これらの命令をどのように構成するかを検討する必要があります。次の例は、A53スモールコアにおけるfp32 Matmulの最適化を示しています。Matmulは計算負荷の高い演算子であるため、メモリアクセス命令のオーバーヘッドを複数の問題に隠蔽することを検討します。MegPeakを用いて解析を行い、命令をどのように組み合わせれば可能な限り多くの問題を達成できるかを検討します。 小さなコアではリソースが限られているため、複数の命令を発行する際には多くの制限があります。
上記の命令の組み合わせにより、Matmul は小さなコア上で計算ピークの約 70% に到達できます。 要約MegPeakは、高性能コンピューティングツールとして、開発者がターゲットプロセッサの詳細な内部情報を容易に取得できるようにし、コードパフォーマンスの評価や最適化手法の設計を支援します。しかしながら、MegPeakにはさらなる開発が必要な領域もいくつかあります。
上記の機能に興味のある学生は、GitHub でコードを提出するか、MegPeak を使用してみてください。 |