3

キャッシュのタイプ(ライトバック/スルー)をキャッシュするための書き込みをテストして判断するにはどうすればよいですか?キャッシュを変更する時間を記録することでキャッシュのレベルとサイズを決定するのと同様の方法を使用できますが、何かと比較する必要があります。例えば。既知のL1がキャッシュを介して書き込むよりも時間が大幅に短い場合は、ライトバックと言えます。ただし、比較するためのベースラインが必要になりますね。

これがGitHubでの私の試みです

主なアイデアは次のとおりです。

  • ライトスルーの場合、書き込みにかかる時間とx時間の関係x * 100は約100倍です。
  • 書き戻した場合、時間はほぼ同じになりますか?

したがって、時間のループと時間のWRITES_BASE時間WRITESからそれぞれの時間を引いてループのみを実行し(メモリアクセスなし)、それらを比較します...これは私のCorei32100がすべてキャッシュを介して書き込みを行っているという印象を与えます...

16, 0.03, 1.04 (31.28) 
128, 0.07, 2.31 (31.78) 
2048, 0.10, 3.19 (31.74) 

上記の値は次のとおりです。test size (KB), time for WRITES_BASE, time for WRITES (t(WRITES)/t(WRITES_BASE))

私の実験の問題は、私がWRITESより多くの回数実行している時間差を排除していないことだと思います...

アップデート

私が気付いた奇妙なことは、私が自分のを保持しているWRITES = 64 * WRITES_BASE場合、そして私が自分のを持っている場合ですWRITES_BASE = 4 million

16, 0.01, 0.13 (17.16) 
128, 0.01, 0.29 (31.60) 
2048, 0.01, 0.41 (30.53) 

増やすとWRITES_BASE = 16 million

16, 0.02, 0.52 (25.53) 
128, 0.04, 1.16 (31.74) 
2048, 0.05, 1.57 (31.89)

が小さいほど、WRITES_BASE時間の差が小さくなり、L1がライトバックキャッシュであることがわかります。ただし、常に正しいとは限らないため、たとえば。WRITES_BASEを増やすと、論理エラーが発生しているのではないかと思います。

4

1 に答える 1

2

この手順では、ライトバックキャッシュとライトスルーキャッシュを実際に区別することはできません。考慮事項:ライトバックキャッシュを使用している場合、ループ内の命令を実行するのにX時間かかり、ライトバックするのにY時間かかります。Yはコードによって測定されません(明示的なキャッシュフラッシュなどのタイミングはありません)。N回ループすると、N * X時間に加えて、コードの実行が完了してキャッシュをフラッシュした後、Yがかかります。

ライトスルーキャッシュを使用すると、Xが高くなり、Yがゼロになります。ただし、単一ループと多数のループの比率は同じです。したがって、この手順との違いはわかりません。

そうは言っても、これを検出する方法はいくつかあります。重要なのは、タイミングを合わせている間、キャッシュにキャッシュラインを強制的にフラッシュさせることです。さまざまなサイズの配列を書き込むのにかかる時間を比較してみてください。書き込みの合間には、無関係なデータを大量に読み取ることで、ライトバックキャッシュがフラッシュされるようにします(注:大きな配列を割り当てて、書き込みを行わずに読み取りを行うのではなく、プログラムの起動時に1回書き込みを行ってから、すべてを読み取ります)。そうしないと、OSによっては、配列内のすべてのページが物理メモリ内の同じゼロ化されたページを指す場合があります。

また、大量のデータを書き込むことが読み取りの速度に影響するかどうかを確認することもできます。ライトスルーキャッシュでは、最近データを書き込んだという理由だけで、読み取りに時間がかかることはありません。ライトバックキャッシュでは、読み取りはキャッシュフラッシュを待機する必要がある場合があります。そのため、読み取りのタイミングを単独で行うのではなく、書き込みの直後に行うと、興味深い結果が得られる場合があります。

于 2012-10-05T07:16:52.243 に答える