10

まず、私はコンピューター サイエンス以外のバックグラウンドを持っており、C++ 言語を学んでいることをお伝えしたいと思います。キャッシュとは正確には何なのか理解できませんか? 異なる文脈では異なる意味を持ちます。C++ プログラムでキャッシュと呼ばれるものを教えてください。たとえばint、ファイルにデータがあるとします。それを読んでint配列に保存すると、データを「キャッシュ」したことになりますか? ファイルからの読み取りはRAMからの読み取りよりも常に悪いため、これはデータを使用するのが常識のように思えます。しかし、この記事のせいで少し混乱しています。

CPU には、ループ内の命令を高速化するため、または頻繁にアクセスされるデータを格納するために、複数のキャッシュが存在する場合があります。これらのキャッシュは小さいですが、非常に高速です。キャッシュ メモリからのデータの読み取りは、RAM からの読み取りよりもはるかに高速です。

キャッシュからのデータの読み取りは、RAM からの読み取りよりもはるかに高速であると言われています。RAMとキャッシュは同じだと思っていました。誰かが私の混乱を解消してくれませんか?

編集:以前は広すぎたため、質問を更新しています。私の混乱はこの答えから始まりました。彼は言う

RowData と m_data は私の実装に固有のものですが、単にファイル内の行に関する情報をキャッシュするために使用されます

このコンテキストでのキャッシュとはどういう意味ですか?

4

4 に答える 4

20

Any modern CPU has several layers of cache that are typically named things like L1, L2, L3 or even L4. This is called a multi-level cache. The lower the number, the faster the cache will be.

It's important to remember that the CPU runs at speeds that are significantly faster than the memory subsystem. It takes the CPU a tiny eternity to wait for something to be fetched from system memory, many, many clock-cycles elapse from the time the request is made to when the data is fetched, sent over the system bus, and received by the CPU.

There's no programming construct for dealing with caches, but if your code and data can fit neatly in the L1 cache, then it will be fastest. Next is if it can fit in the L2, and so on. If your code or data cannot fit at all, then you'll be at the mercy of the system memory, which can be orders of magnitude slower.

This is why counter-intuitive things like unrolling loops, which should be faster, might end up being slower because your code becomes too large to fit in cache. It's also why shaving a few bytes off a data structure could pay huge dividends even though the memory footprint barely changes. If it fits neatly in the cache, it will be faster.

The only way to know if you have a performance problem related to caching is to benchmark very carefully. Remember each processor type has varying amounts of cache, so what might work well on your i7 CPU might be relatively terrible on an i5.

It's only in extremely performance sensitive applications that the cache really becomes something you worry about. For example, if you need to maintain a steady 60FPS frame rate in a game, you'll be looking at cache problems constantly. Every millisecond counts here. Likewise, anything that runs the CPU at 100% for extended periods of time, such as rendering video, will want to pay very close attention to how much they could gain from adjusting the code that's emitted.

You do have control over how your code is generated with compiler flags. Some will produce smaller code, some theoretically faster by unrolling loops and other tricks. To find the optimal setting can be a very time-consuming process. Likewise, you'll need to pay very careful attention to your data structures and how they're used.

于 2013-09-18T18:21:50.177 に答える