GNU/Linux >> Znalost Linux >  >> Linux

Výkon 32bitová vs. 64bitová aritmetika

Záleží na konkrétním CPU a provozu. Například na 64bitových Pentiích IV bylo násobení 64bitových registrů o něco pomalejší. CPU Core 2 a novější byly od základu navrženy pro 64bitový provoz.

Obecně i kód napsaný pro 64bitovou platformu používá 32bitové proměnné, do kterých se vejdou hodnoty. Není to primárně proto, že by aritmetika byla rychlejší (na moderních CPU obecně není), ale proto, že využívá méně paměti a šířku pásma paměti.

Struktura obsahující tucet celých čísel bude mít poloviční velikost, pokud jsou tato celá čísla 32bitová, než když jsou 64bitová. To znamená, že uložení zabere polovinu bajtů, polovinu místa v mezipaměti a tak dále.

64bitové nativní registry a aritmetika se používají tam, kde se hodnoty nemusí vejít do 32bitů. Ale hlavní výhody výkonu pocházejí z dalších obecných registrů dostupných v instrukční sadě x86_64. A samozřejmě existují všechny výhody, které pocházejí z 64bitových ukazatelů.

Takže skutečná odpověď je, že na tom nezáleží. I když používáte režim x86_64, můžete (a obecně používáte) stále používat 32bitovou aritmetiku tam, kde to bude možné, a získáte výhody větších ukazatelů a obecnějších registrů. Když používáte 64bitové nativní operace, je to proto, že potřebujete 64bitové operace a víte, že budou rychlejší, než to předstírat pomocí více 32bitových operací – vaše jediná další možnost. Relativní výkon 32bitových oproti 64bitovým registrům by tedy nikdy neměl být rozhodujícím faktorem při rozhodování o implementaci.


Právě jsem narazil na tuto otázku, ale myslím, že zde chybí jeden velmi důležitý aspekt:​​pokud se opravdu podíváte dolů do kódu assembleru pomocí typu „int“ pro indexy, pravděpodobně to zpomalí kód, který váš kompilátor generuje. Důvodem je „int“ výchozí na 32bitový typ na mnoha 64bitových kompilátorech a platformách (Visual Studio, GCC) a provádění výpočtů adres s ukazateli (které jsou nutně 64bitové na 64bitovém OS) a „int“ způsobí, že kompilátor bude vydávat zbytečné převody mezi 32 a 64bitovými registry. .Právě jsem to zažil ve vnitřní smyčce mého kódu, která je velmi kritická pro výkon. Přepnutím z 'int' na 'long long', protože index smyčky zlepšil dobu běhu mého algoritmu asi o 10 %, což byl poměrně obrovský zisk vzhledem k rozsáhlé vektorizaci SSE/AVX2, kterou jsem v té době již používal.


Linux
  1. MySQL – ladění a optimalizace výkonu

  2. Ovlivňuje LVM výkon?

  3. Závorka v aritmetice výrazu:3 * (2 + 1)?

  1. Jak zjistit, zda je daný Linux 32bitový nebo 64bitový?

  2. Propojení 32bitové knihovny s 64bitovým programem

  3. dd výkon na Mac OS X vs. Linux

  1. Použití segmentačních registrů

  2. Použití 1GB stránek snižuje výkon

  3. Aritmetický výraz v přesměrování