web-dev-qa-db-ja.com

mutex実装をテストおよびベンチマークする方法

タイトルが言うように:C++でのミューテックスのさまざまな実装を適切にテストおよびベンチマークするにはどうすればよいですか?

基本的に私は、競合しない場合のオーバーヘッドを最小限に抑えることを目的として、2コアarmv7で実行されるプロジェクト用に独自のstd :: mutexのようなクラスを記述しました。今、私はより多くの場所で、また異なるアーキテクチャーで上記のミューテックスを使用することを検討していますが、これを行う前に、それを確認したいと思います

  • それは実際に正しいです
  • 標準のstd :: mutexよりもパフォーマンスが悪い病理学的なケースはありません。

明らかに、いくつかの基本的な単体テストとマイクロベンチマークを書きましたが、すべてが機能しているように見えますが、マルチスレッドコードでは、「機能しているように見えます」ので快適ではありません。

  • それで、確立された静的または動的分析手法はありますか?
  • Mutexクラスの単体テストを作成するときの一般的な落とし穴は何ですか?
  • (パフォーマンスの観点から)注目すべき典型的なEdgeケースは何ですか?

私は実装に標準のライブラリタイプのみを使用しています。これには、アトミックでの一貫性のないロードおよびストア操作が含まれます。ただし、他の実装にも同じテストハーネスを使用したいので、主に実装にとらわれないアドバイスに関心があります。

12
MikeMB

問題は複雑です:

複雑さのいくつかの原因は次のとおりです。

  • 実行されているコンテキストスイッチの数:これは、これらのテストが実行されるプラットフォームによっては非常に重要です。一部のプラットフォームは他のプラットフォームよりもこれをうまく処理します
  • Mutexがインラインでテストされるかどうかは関数です。つまり、mutexは適切に最適化または最適化されたコードでのみうまく機能しますか。
  • これらのミューテックスは、キャッシュの局所性のために設計されていますか?キャッシュミスにより、パフォーマンスが大幅に低下するか、コンテキストの切り替えが多くなります。ミューテックスに入る前後。
  • ミューテックス自体がキャッシュの局所性を失う原因になりますか。つまり、動的に割り当てられたミューテックス状態データです。
  • これらのミューテックスは、コンテキストスイッチがミューテックス内に含まれている場合にうまく機能しますか?つまり、io、mallocなど。
  • カーネル時間がmutexに含まれていれば、mutexはうまく機能しますか?動的メモリの割り当てと割り当て解除。
  • VM内で実行するときにパフォーマンスは維持されますか
  • ミューテックスの破棄または構築は高価ですか?つまり、状態データは動的メモリに配置されています