GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Ausrichtung auf die Cache-Zeile und Kenntnis der Cache-Zeilengröße

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 catern
grep 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.


Linux
  1. Kopieren und Einfügen in der Linux-Befehlszeile mit xclip

  2. Das Ergebnis von Ls * , Ls ** und Ls ***?

  3. Der Unterschied zwischen [[ $a ==Z* ]] und [ $a ==Z* ]?

  4. Wie ändere ich die Standardzeilenlänge für Od und Hexdump?

  5. Warum stimmen Ls und Hexdump nicht über die Dateigröße überein?

Ohcount – Der Quellcode-Zeilenzähler und -Analysator

Die größten Dateien und Ordner in der Linux-Befehlszeile finden

MySQL die Befehlszeile und Pager

Wie erzeuge ich den CPU-Cache-Effekt in C und Java?

Wie kann ich die aktuelle Größe des ARC in ZFS ermitteln und in welcher Beziehung steht der ARC zu freiem oder Cache-Speicher?

Bedeutung der Buffer/Cache-Zeile in der Ausgabe von free