Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ cache aware programming

is there a way in C++ to determine the CPU's cache size? i have an algorithm that processes a lot of data and i'd like to break this data down into chunks such that they fit into the cache. Is this possible? Can you give me any other hints on programming with cache-size in mind (especially in regard to multithreaded/multicore data processing)?

Thanks!

like image 617
Mat Avatar asked Dec 17 '09 14:12

Mat


People also ask

What is cache aware programming?

It creates an array of size SIZE*SIZE and then loops over the array setting each element to zero. The time it takes to loop over the array is measured and printed out. The loop is implemented with two for loops, each iterating from 0 to SIZE.

How do I optimize cache code?

Avoid using algorithms and data structures that exhibit irregular memory access patterns; use linear data structures instead. Use smaller data types and organize the data so there aren't any alignment holes.

How is array cache friendly?

Cache-friendly data structures fit within a cache line and are aligned to memory such that they make optimal use of cache lines. A common example of a cache-friendly data structure is a two-dimensional matrix. We can set its row dimension to fit in a cache size block for optimal performance.


3 Answers

According to "What every programmer should know about memory", by Ulrich Drepper you can do the following on Linux:

Once we have a formula for the memory requirement we can compare it with the cache size. As mentioned before, the cache might be shared with multiple other cores. Currently {There definitely will sometime soon be a better way!} the only way to get correct information without hardcoding knowledge is through the /sys filesystem. In Table 5.2 we have seen the what the kernel publishes about the hardware. A program has to find the directory:

/sys/devices/system/cpu/cpu*/cache

This is listed in Section 6: What Programmers Can Do.

He also describes a short test right under Figure 6.5 which can be used to determine L1D cache size if you can't get it from the OS.

There is one more thing I ran across in his paper: sysconf(_SC_LEVEL2_CACHE_SIZE) is a system call on Linux which is supposed to return the L2 cache size although it doesn't seem to be well documented.

like image 183
Robert S. Barnes Avatar answered Oct 16 '22 06:10

Robert S. Barnes


C++ itself doesn't "care" about CPU caches, so there's no support for querying cache-sizes built into the language. If you are developing for Windows, then there's the GetLogicalProcessorInformation()-function, which can be used to query information about the CPU caches.

like image 29
kusma Avatar answered Oct 16 '22 07:10

kusma


Preallocate a large array. Then access each element sequentially and record the time for each access. Ideally there will be a jump in access time when cache miss occurs. Then you can calculate your L1 Cache. It might not work but worth trying.

like image 9
ben Avatar answered Oct 16 '22 05:10

ben