2

私は 2 つのアプローチに精通していますが、どちらにも限界があります。

1 つ目は、命令を使用することRDTSCです。ただし、問題は、プログラムのサイクル数を単独でカウントしないため、同時プロセスによるノイズの影響を受けやすいことです。

2 番目のオプションは、clockライブラリ関数を使用することです。このアプローチは信頼できると思いました。これは、プログラムのサイクル数のみをカウントすることを期待していたからです (達成しようとしているもの)。ただし、私の場合、経過時間を測定してから掛けることがわかりました CLOCKS_PER_SEC。プロセッサの実際の周波数に対応しない にCLOCKS_PER_SEC設定されているため、これは信頼できないだけでなく、間違って います。1,000,000

提案されたアプローチの限界を考えると、一貫した結果を生成するためのより優れた信頼性の高い代替手段はありますか?

4

3 に答える 3

0

RDTSC は、プログラムの実行サイクルをカウントする最も正確な方法です。スレッドがプリエンプトされたかどうかが重要な時間スケールで実行パフォーマンスを測定する場合は、おそらくプロファイラー (たとえば、VTune) を使用することをお勧めします。

CLOCKS_PER_SECOND/clock() は、オーバーヘッドがほとんどない RDTSC と比較して、時間を取得するための非常に悪い (パフォーマンスの低い) 方法です。

RDTSC に特定の問題がある場合は、私がお手伝いできるかもしれません。


re: コメント

Intel Performance Counter Monitor : これは主に、メモリ帯域幅、電力使用量、PCIe 使用率など、プロセッサの外部のメトリックを測定するためのものです。また、たまたま CPU 周波数を測定することもありますが、通常、プロセッサに依存するアプリケーションのパフォーマンスには役立ちません。

RDTSCの移植性: RDTSC は、最新のすべての Intel CPU でサポートされている Intel CPU 命令です。最新の CPU では、CPU のアンコア周波数に基づいており、CPU コア全体で多少似ていますが、アプリケーションが頻繁に異なるコア (特に異なるソケット) にプリエンプトされる場合は適切ではありません。その場合は、本当にプロファイラーを見たいと思うでしょう。

Out of order Execution : はい、順不同で実行されるため、パフォーマンスにわずかに影響する可能性がありますが、それでも命令の実行には時間がかかり、RDTSC はその時間を測定する最良の方法です。これは、同じコアで非 IO バウンド命令を実行するという通常のユースケースに優れており、これが本来の使用方法です。より複雑なユースケースがある場合は、実際には別のツールを使用する必要がありますが、プログラム実行の分析に rdtsc() が非常に役立つ可能性があることを否定するものではありません。

于 2016-03-10T18:14:55.257 に答える