<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>cache on tmtoku</title>
    <link>https://tmtoku.pages.dev/tags/cache/</link>
    <description>Recent content in cache on tmtoku</description>
    <generator>Hugo</generator>
    <language>ja</language>
    <lastBuildDate>Sun, 16 Aug 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://tmtoku.pages.dev/tags/cache/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>CPU キャッシュのレイテンシを測る</title>
      <link>https://tmtoku.pages.dev/posts/micro-benchmark-memory-latency/</link>
      <pubDate>Sun, 16 Aug 2026 00:00:00 +0000</pubDate>
      <guid>https://tmtoku.pages.dev/posts/micro-benchmark-memory-latency/</guid>
      <description>&lt;p&gt;CPU の演算と比べて主記憶（DRAM）へのアクセスは遅く、多くのアプリケーションでメモリアクセスが性能のボトルネックになります。この問題に対処するため、現代の CPU は内部に高速なキャッシュメモリを備えています。
キャッシュ内のデータを再利用できれば、主記憶へのアクセス回数を減らすことができます。&lt;/p&gt;
&lt;p&gt;キャッシュを有効活用するためには、キャッシュの階層構造や各階層のレイテンシを定量的に把握しておくことが重要です。
そういった情報は、CPU の仕様書に書かれているものですが、今回は実測してみようと思います。
どのようなプログラムならば仕様書に記載されている通りの性能が出るのかを知っておくことは有益ですし、情報が公開されていないプロセッサが出てきた場合にも計測できると便利ですからね。&lt;/p&gt;
&lt;h2 id=&#34;メモリ階層&#34;&gt;メモリ階層&lt;/h2&gt;
&lt;p&gt;DRAM 上のデータは、キャッシュライン単位&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;でキャッシュに読み込まれます。
読み込まれたデータはしばらくの間キャッシュに置かれているため、
同じキャッシュライン上のデータに複数回アクセスする場合は、高速に取得できます。&lt;/p&gt;
&lt;p&gt;現代の CPU の多くは、速度と容量の異なる複数のキャッシュを持っています。
一般に容量の大きいキャッシュほど、アクセスにかかる時間（レイテンシ）も大きくなります。&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;images/micro-benchmark-memory-latency.svg&#34;
         alt=&#34;レジスタ、キャッシュ、DRAM の速度と容量の関係&#34; width=&#34;400&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;レジスタ、キャッシュ、DRAM の速度と容量の関係&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;CPU はメモリ上のデータにアクセスする際、まず L1 キャッシュに目的のデータが存在するかを確認します。L1 キャッシュにデータが存在する場合（キャッシュヒット時）はそれを参照し、存在しない場合（キャッシュミス時）は、L2 や L3 キャッシュ、DRAM からデータを取得します。&lt;/p&gt;
&lt;h3 id=&#34;キャッシュ構成の例&#34;&gt;キャッシュ構成の例&lt;/h3&gt;
&lt;p&gt;例として、AMD Ryzen 7 4700U (Zen 2) のキャッシュ構成を &lt;code&gt;lstopo&lt;/code&gt; コマンドで確認してみます。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ lstopo --no-io --no-icaches --no-legend
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;images/lstopo.svg&#34;
         alt=&#34;AMD Ryzen 7 4700U のキャッシュ構成&#34; width=&#34;400&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;AMD Ryzen 7 4700U のキャッシュ構成&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;ul&gt;
&lt;li&gt;CPU コアは 8 個&lt;/li&gt;
&lt;li&gt;L1 キャッシュと L2 キャッシュはコアごとに独立しており、容量はそれぞれ 32 KiB、512 KiB&lt;/li&gt;
&lt;li&gt;L3 キャッシュはコア 0〜3 とコア 4〜7 でそれぞれ共有されており、容量は 4 MiB × 2&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;各階層のキャッシュラインサイズや way 数は次のコマンドで取得できます。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
