webentwicklung-frage-antwort-db.com.de

An Cache-Zeile ausrichten und die Größe der Cache-Zeile kennen

Um eine falsche Freigabe zu verhindern, möchte ich jedes Element eines Arrays an einer Cache-Zeile ausrichten. Also muss ich zuerst die Größe einer Cache-Zeile kennen, damit ich jedem Element diese Anzahl von Bytes zuweisen kann. Zweitens möchte ich, dass der Anfang des Arrays an einer Cache-Zeile ausgerichtet wird.

Ich benutze Linux und 8-Core x86-Plattform. Wie finde ich zuerst die Cache-Zeilengröße? Zweitens, wie kann ich mich an einer Cache-Zeile in C ausrichten? Ich verwende den gcc-Compiler.

So würde die Struktur beispielsweise unter der Annahme einer Cache-Zeilengröße von 64 folgen.

element[0] occupies bytes 0-63
element[1] occupies bytes 64-127
element[2] occupies bytes 128-191

und so weiter, natürlich unter der Annahme, dass 0-63 auf eine Cache-Zeile ausgerichtet ist.

56
MetallicPriest

Um die Größen zu kennen, müssen Sie sie anhand der Dokumentation des Prozessors nachschlagen. Es gibt jedoch keine programmgesteuerte Möglichkeit, dies zu tun. Positiv ist jedoch, dass die meisten Cache-Zeilen eine Standardgröße haben, die auf Intel-Standards basiert. Bei x86-Cache-Zeilen sind es 64 Byte. Um jedoch 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). In der Regel müssen Sie hierfür eine Ausrichtung auf 64 Byte vornehmen (Intel gibt an, dass Sie auch das Überschreiten von 16-Byte-Grenzen vermeiden sollten).

Um dies in C oder C++ zu tun, müssen Sie die Standardfunktion aligned_alloc Oder einen der compilerspezifischen Bezeichner wie __attribute__((align(64))) oder __declspec(align(64)) verwenden. Um Elemente in einer Struktur aufzufüllen, um sie auf verschiedene Cache-Zeilen aufzuteilen, müssen Sie ein Element einfügen, das groß genug ist, um es an der nächsten 64-Byte-Grenze auszurichten

32
Necrolis

Ich benutze Linux und 8-Core x86-Plattform. Wie finde ich zuerst 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 kann sysconf(_SC_LEVEL1_DCACHE_LINESIZE) verwendet werden, um die L1-Cache-Größe abzurufen.

78

Es gibt keine vollständig portable Möglichkeit, die Cacheline-Größe zu ermitteln. Wenn Sie jedoch mit x86/64 arbeiten, können Sie die Anweisung cpuid aufrufen, um alle Informationen zum Cache abzurufen - einschließlich Größe, Cacheline-Größe, Anzahl der Ebenen usw.

http://softpixel.com/~cwright/programming/simd/cpuid.php

(Scrollen Sie ein wenig nach unten, die Seite handelt von SIMD, aber es gibt einen Abschnitt, in dem die Cacheline angezeigt wird.)

Was die Ausrichtung Ihrer Datenstrukturen betrifft, gibt es auch keine vollständig portable Möglichkeit, dies zu tun. GCC und VS10 haben verschiedene Möglichkeiten, die Ausrichtung einer Struktur anzugeben. Eine Möglichkeit zum "Hacken" besteht darin, Ihre Struktur mit nicht verwendeten Variablen aufzufüllen, bis sie der gewünschten Ausrichtung entspricht.

Um Ihre mallocs () auszurichten, verfügen alle Mainstream-Compiler zu diesem Zweck auch über ausgerichtete malloc-Funktionen.

9
Mysticial

Ein anderer einfacher Weg ist, einfach die/proc/cpuinfo zu katzen:

cat/proc/cpuinfo | grep cache_alignment

9
Francesquini

posix_memalign oder valloc können verwendet werden, um Richten Sie den zugewiesenen Speicher auf eine Cache-Zeile aus.

8
MetallicPriest

Wenn jemand daran interessiert ist, wie dies in C++ einfach zu bewerkstelligen ist, habe ich eine Bibliothek mit einer CacheAligned<T> - Klasse erstellt, die die Bestimmung der Cache-Zeilengröße sowie die Ausrichtung für Ihr T -Objekt übernimmt. Auf die verwiesen wird, indem .Ref() für Ihr CacheAligned<T> - Objekt aufgerufen wird. Sie können auch Aligned<typename T, size_t Alignment> Verwenden, wenn Sie die Cache-Zeilengröße im Voraus kennen oder einfach den sehr üblichen Wert von 64 (Byte) beibehalten möchten.

https://github.com/NickStrupat/Aligned

2
Nick Strupat