Ich verwende Linux und eine 8-Kern-x86-Plattform. Erstens, wie finde ich die Cache-Zeilengröße.
$ getconf LEVEL1_DCACHE_LINESIZE
64
Übergeben Sie den Wert als Makrodefinition an den Compiler.
$ gcc -DLEVEL1_DCACHE_LINESIZE=`getconf LEVEL1_DCACHE_LINESIZE` ...
Zur Laufzeit sysconf(_SC_LEVEL1_DCACHE_LINESIZE)
kann verwendet werden, um die L1-Cache-Größe zu erhalten.
Um die Größen zu kennen, müssen Sie sie anhand der Dokumentation für den Prozessor nachschlagen, afaik, es gibt keine programmatische Möglichkeit, dies zu tun. Auf der positiven Seite haben die meisten Cache-Zeilen jedoch eine Standardgröße, basierend auf den Intel-Standards. Auf x86-Cache-Zeilen sind 64 Bytes, aber um eine falsche Freigabe zu verhindern, müssen Sie die Richtlinien des Prozessors befolgen, auf den Sie abzielen (Intel hat einige spezielle Hinweise zu seinen Netburst-basierten Prozessoren). Im Allgemeinen müssen Sie sich dafür auf 64 Bytes ausrichten (Intel gibt an, dass Sie auch vermeiden sollten, 16-Byte-Grenzen zu überschreiten).
Um dies in C oder C++ zu tun, müssen Sie den Standard aligned_alloc
verwenden Funktion oder einer der Compiler-spezifischen Bezeichner wie __attribute__((align(64)))
oder __declspec(align(64))
. Um zwischen Mitgliedern in einer Struktur aufzufüllen, um sie auf verschiedene Cache-Zeilen aufzuteilen, müssen Sie ein Mitglied einfügen, das groß genug ist, um es an der nächsten 64-Byte-Grenze auszurichten
Eine andere einfache Möglichkeit besteht darin, einfach /proc/cpuinfo:
zu caterngrep cache_alignment /proc/cpuinfo
Es gibt keinen vollständig portablen Weg, um die Cacheline-Größe zu ermitteln. Aber wenn Sie auf x86/64 sind, können Sie cpuid
anrufen Anweisungen, um alles zu erfahren, was Sie über den Cache wissen müssen - einschließlich Größe, Cacheline-Größe, wie viele Ebenen usw....
http://softpixel.com/~cwright/programming/simd/cpuid.php
(Scrollen Sie etwas nach unten, die Seite handelt von SIMD, aber es gibt einen Abschnitt, der die Cacheline enthält.)
Was das Ausrichten Ihrer Datenstrukturen betrifft, so gibt es auch keine vollständig portable Möglichkeit, dies zu tun. GCC und VS10 haben unterschiedliche Möglichkeiten, die Ausrichtung einer Struktur anzugeben. Eine Möglichkeit, sie zu "hacken", besteht darin, Ihre Struktur mit unbenutzten Variablen aufzufüllen, bis sie der gewünschten Ausrichtung entspricht.
Um Ihre mallocs() auszurichten, haben alle Mainstream-Compiler ebenfalls ausgerichtete malloc-Funktionen für diesen Zweck.