ユーザー定義の数のスレッドを使用して処理を行うベンチマーク アプリケーションに取り組んでいます。また、ベンチマーク結果のビジュアライザー アプリケーションにも取り組んでいます。
ベンチマーク自体は C++ で作成されており (スレッド化には pthread を使用しています)、ビジュアライザーは Python で作成されています。
現在、2 つの話をするために私が行っているのはstdout
、ベンチマークからビジュアライザーへのパイプです。netcat
これには、あるマシンでベンチマークを実行し、別のマシンでビジュアライザーを実行するようなツールを使用できるという利点があります。
ベンチマークについて少し:
- それは非常にCPUバウンドです
- 各スレッドは、数十ミリ秒ごとに重要なデータ (つまり、ビジュアライザーに必要なデータ) を書き込みます。
- 印刷される各データムは、5 ~ 20 文字の行です。
- 前述のように、スレッドの数は非常に多様です (1、2、40 など)。
- データが壊れていないことは重要ですが (たとえば、あるスレッドが
printf
/の実行中に別のスレッドをプリエンプトcout
し、印刷されたデータが別のスレッドの出力とインターリーブされるなど)、書き込みが正しい方法で行われることはそれほど重要ではありません。注文。
最後のポイントに関する例:
// Thread 1 prints "I'm one\n" at the 3 seconds mark
// thread 2 prints "I'm two\n" at the 4 seconds mark
// This is fine
I'm two
I'm one
// This is not
I'm I'm one
two
ベンチマークでは、異なるスレッドの出力間のインターリーブの可能性を最小限に抑えるために、(2) にstd::cout
近いprintf
ためから に切り替えました。write
stdout
スレッド数が増えると複数スレッドからの書き込みがボトルネックになるのではないかと心配です。結果をゆがめないように、ベンチマークの視覚化のための出力部分のリソースが非常に少ないことが非常に重要です。
ベンチマークのパフォーマンスに絶対に不可欠なもの以上に影響を与えることなく、2 つのアプリケーションを対話させる効率的な方法についてのアイデアを探しています。何か案は?以前にこのような問題に取り組んだ人はいますか? よりスマートでクリーンなソリューションはありますか?