10

座標スキーム形式 (COOS) と圧縮行形式 (CSR) でスパース行列を乗算するための ASM プログラムを実装する必要がありました。これらのアルゴリズムをすべて実装したので、通常の行列乗算と比較してどれだけパフォーマンスが高いかを知りたいと思います。これらすべてのアルゴリズムの実行時間を測定するコードを既に実装しましたが、実行できる 1 秒あたりの浮動小数点演算 (FLOPS) の数も知りたいと判断しました。これを測定/カウントする方法の提案はありますか?

ここでは、使用されているシステムに関する背景情報をいくつか示します。

processor   : 0
model name  : ARMv7 Processor rev 2 (v7l)
Features    : swp half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpd32 
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x3
CPU part    : 0xc08
CPU revision    : 2

私たちの最初のアイデアは、浮動小数点演算 (算術演算、比較演算、移動演算) ごとにインクリメントする一種の FPO カウンターを実装することでしたが、これはコード全体にインクリメント演算を挿入する必要があり、速度も遅くなります。アプリケーションをダウンさせます...浮動小数点演算の数をカウントする何らかのハードウェアカウンターがあるかどうか、またはプログラムを監視してFPOの数を測定するために使用できる何らかのパフォーマンスツールが存在するかどうか、誰かが知っていますか. 提案や指針をいただければ幸いです。

以下は、カウンティング アプローチを使用した行列乗算の FLOP の評価です。最初に、関心のある各命令の挿入されたカウンターよりも実行時間を測定し、その後、1 秒あたりの浮動小数点演算の数を計算しました。 行列乗算の 1 秒あたりの浮動小数点演算

4

2 に答える 2

10

Cortex-A8 でサポートされているパフォーマンス イベントで得られる最も近いのは、実行された命令の総数です。これは、「命令」が 0 から (私が思うに) 8 つの FP 操作を実行することを考えると、あまり役に立ちません。一歩下がって、ハードウェアでアルゴリズムのFLOPS を測定しようとしても、実際にはうまくいかないことが明らかになります。たとえば、ベクトル演算を使用して実装を記述できますが、常に実際のデータを各ベクトルのすべてのレーンに配置するとは限りません。実際に実行している FP 操作の数を知るには、精神的である必要があります。


幸いなことに、アルゴリズムの正式な定義が与えられた場合、関連する操作の数を計算することはかなり簡単です (ただし、複雑さによっては必ずしも簡単ではありません)。たとえば、頭の中でそれを実行すると、m x n行列とn x m行列の標準的な単純な乗算がm * m * (n + n - 1)演算 (出力要素ごとにn乗算と(n - 1)加算) になります。紙上の分析により、適切にパラメータ化された op-counting 式が得られたら、それをベンチマーク ツールに組み込んで、テスト データの数値を計算できます。

それをすべてやったら、おそらくそれをするのにずっと時間を費やしたことを後悔し始める(arbitrary number) / (execution time)でしょ(execution time)(arbitrary number). 特に NEON のパフォーマンスは、パイプラインのレイテンシとメモリ帯域幅に支配されているため、低レベルの実装の詳細は、アルゴリズムに固有の違いを簡単に上回る可能性があります。

次のように考えてみてください: 100MHz の CPUa + a + b + bが合計 5 サイクルかかり、(a + b) * 2合計 4 サイクルかかるとします* - 前者のスコアは 60 MFLOPS で、後者はわずか 50 MFLOPS です。FLOPS が多いほどパフォーマンスが向上すると言うつもりですか? その場合、同じ結果を得るのに 25%長い時間がかかるルーチンは、何らかの形で「優れている」と言えますか? FLOPS が少ないほどパフォーマンスが向上すると言うつもりですか? これは、合理的な解釈では明らかに正しくありません。それとも、ある CPU の理論上の最大帯域幅を別の CPU と比較するための合成ベンチマーク以外では、FLOPS はほとんど意味がないと結論付けるつもりですか?

* 議論のために何もないところから引き出された数字。ただし、実際には Cortex-M4F のようなものとはかけ離れていません。これは、加算と乗算の両方が単一サイクルであり、レジスタ ハザードが 1 つまたは 2 つある単精度 FPU です。

于 2015-01-26T03:50:44.487 に答える