1

c の関数 system() について、実行したコマンドがどのように実行されたかを確認しようとすると、ハードウェア カウンターに影響しますか?

PAPI_start_counters();
system("./matmul");
PAPI_read_counters();
//Print out values 
PAPI_stop_counters();

私は明らかに少し欠けていますが、私が見つけようとしているのは、上記のカウンターを使用して、実行中のプログラムのパフォーマンスを取得できることです。私のテストから、以下のようなワイルドナンバーが得られます。それらは明らかに間違っています。理由を知りたいだけです

Total Cycles =========== 140733358872510 
Instructions Completed =========== 4203968 
Floating Point Instructions =========== 0 
Floating Point Operations =========== 4196867 
Loads =========== 140733358872804 
Stores =========== 4204037 
Branches Taken =========== 15774436 
4

3 に答える 3

4

system()一般に非常に遅い関数です。Linux では、/bin/shコマンドを解析して 2 番目のプログラムを生成します。これら 2 つのプログラムをロードするには、コードをメモリにロードし、すべてのライブラリを初期化し、スタートアップ コードを実行する必要があります。そうして初めて、プログラム コードが実際に実行を開始します。

ディスク アクセスと Linux プロセスのスケジューリングは予測不可能であるため、タイミングsystem()コールには固有の変動性が非常に高くなります。そのため、高性能なカウンターを使用しても正確な結果は得られません。

より良い解決策は、代わりにターゲット プログラムをライブラリとしてコンパイルすることです。カウンターを初期化する前にロードしてから、ライブラリからメイン関数を実行するだけです。そうすれば、すべてのコードがプロセスで実行され、起動時間はごくわずかになります。このようにして、パフォーマンスの数値がより正確になります。

于 2014-04-26T04:47:07.403 に答える
0

得られた数値は奇数ですが、必ずしも間違っているわけではありません。完了した命令とサイクルの間の大きな不一致は、実行可能な「matmul」が外部プロセス (ディスク I/O など) の完了を多く待機していることを示している可能性があります。msg FP Instructions と FP ops の詳細はわかりませんが、これらの値が異なって表示されている場合は、PAPI に理由があります。

興味深いのは、命令/fp 演算とストアだけでなく、ロードとサイクルが明らかに接続されていることです。

より良い説明をするために、「matmul」の内部について知る必要があります。

于 2014-04-26T04:55:23.853 に答える