lmbench が L1、L2、およびメイン メモリのレイテンシを測定する方法を理解しようとしています。
lat_mem_rdのマニュアルページにはメソッドが記載されていますが、私には明確ではありません:
ベンチマークは、2 つのネストされたループとして実行されます。外側のループは歩幅です。内側のループは配列サイズです。配列サイズごとに、ベンチマークは 1 つのストライドを指すポインターのリングを作成します。配列のトラバースは、
p = (文字 **)*p;
for ループ内 (for ループのオーバーヘッドは重要ではありません。ループは 1000 ロードの長さの展開されたループです)。100 万回の読み込みを行った後、ループは停止します。
「1歩先を指すポインターのリングを作成する」にはどうすればよいですか? これは、ストライド サイズが 128 バイトの場合、各ノードが前のノードからちょうど 128 バイト離れたリンク リストを作成する必要があるということではないでしょうか。malloc はランダムな空きメモリを返すだけなので、C でそれがどのように可能かはわかりません。コードの一部では、常にセグメンテーション違反が発生します。(テストしましたが、 p は何を初期化する必要がありますか?)
SO( link )に同様のスレッドがあり、最初の回答でこれについて説明していますが、リンクされたリストでストライドアプローチを使用する方法については説明していません。ソースコード自体(lat_mem_rd.c)も見たのですが、これもよくわかりませんでした。
どんな助けでも大歓迎です。