GNU/Linux >> Znalost Linux >  >> Linux

Zarovnání podle řádku mezipaměti a znalost velikosti řádku mezipaměti

Používám Linux a 8jádrovou platformu x86. Nejprve, jak zjistím velikost řádku mezipaměti.

$ getconf LEVEL1_DCACHE_LINESIZE
64

Předejte hodnotu jako definici makra kompilátoru.

$ gcc -DLEVEL1_DCACHE_LINESIZE=`getconf LEVEL1_DCACHE_LINESIZE` ...

Za běhu sysconf(_SC_LEVEL1_DCACHE_LINESIZE) lze použít k získání velikosti mezipaměti L1.


Chcete-li znát velikosti, musíte si to vyhledat pomocí dokumentace k procesoru, afaik neexistuje žádný programový způsob, jak to udělat. Pozitivní však je, že většina řádků mezipaměti má standardní velikost na základě standardů intel. Na x86 mezipaměti jsou řádky 64 bajtů, ale abyste zabránili falešnému sdílení, musíte se řídit pokyny procesoru, na který se zaměřujete (intel má některé speciální poznámky ke svým procesorům založeným na netburstu), obecně je k tomu potřeba zarovnat na 64 bajtů. (Intel uvádí, že byste se také měli vyvarovat překračování hranic 16 bajtů).

Chcete-li to provést v C nebo C++, musíte použít standardní aligned_alloc funkce nebo jeden ze specifikátorů specifických pro kompilátor, jako je __attribute__((align(64))) nebo __declspec(align(64)) . Chcete-li vložit mezi členy ve struktuře a rozdělit je na různé řádky mezipaměti, musíte vložit člen dostatečně velký, aby jej zarovnal k dalšímu 64bajtovému ohraničení


Dalším jednoduchým způsobem je jednoduše zaškrtnout /proc/cpuinfo:

grep cache_alignment /proc/cpuinfo

Neexistuje žádný zcela přenosný způsob, jak získat velikost mezipaměti. Ale pokud používáte x86/64, můžete zavolat cpuid instrukce, abyste získali vše, co potřebujete vědět o mezipaměti - včetně velikosti, velikosti mezipaměti, kolik úrovní atd...

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

(Posuňte se trochu dolů, stránka je o SIMD, ale má sekci, která získává cacheline.)

Pokud jde o zarovnání vašich datových struktur, neexistuje také žádný zcela přenosný způsob, jak to udělat. GCC a VS10 mají různé způsoby, jak specifikovat zarovnání struktury. Jedním ze způsobů, jak "hacknout", je vyplnění vaší struktury nepoužitými proměnnými, dokud nebude odpovídat požadovanému zarovnání.

Chcete-li sladit vaše mallocs(), mají všechny mainstreamové kompilátory také zarovnané funkce malloc pro tento účel.


Linux
  1. Zkopírujte a vložte na příkazový řádek Linuxu pomocí xclip

  2. Koncept 'Hold space' a 'Pattern space' v sed

  3. Význam řádku buffery/cache ve výstupu free

  1. Výsledek Ls *, Ls ** a Ls ***?

  2. Manipulace s úchopy kláves a ukazatelů X na příkazovém řádku?

  3. Tisknout odpovídající čáru a N-tou čáru ze shodné čáry?

  1. Rozdíl mezi [[ $a ==Z* ]] a [ $a ==Z* ]?

  2. Jak změnit výchozí délku čáry pro Od a Hexdump?

  3. Proč Ls a Hexdump nesouhlasí s velikostí souboru?