Czy programy 64-bitowe są większe i szybsze niż wersje 32-bitowe?

Przypuszczam, że skupiam się na x86, ale ogólnie interesuje mnie przejście z 32 NA 64 bit.

Logicznie widzę, że stałe i wskaźniki, w niektórych przypadkach, będą większe, więc programy prawdopodobnie będą większe. A chęć przydzielania pamięci na granicach słowa dla wydajności oznaczałaby więcej białej przestrzeni między przydziałami.

Słyszałem też, że tryb 32 bitowy na x86 musi spłukać swoją pamięć podręczną podczas przełączania kontekstu z powodu możliwego nakładania się adresu 4G miejsca.

Jakie są realne zalety 64 bitów?

I jako dodatkowe pytanie, czy 128 bit będzie jeszcze lepszy?

Edit:

Właśnie napisałem mój pierwszy program 32/64 bitowy. Tworzy połączone listy / drzewa obiektów 16-bajtowych (wersja 32b) lub 32-bajtowych (wersja 64b) i dużo drukuje na stderr-niezbyt przydatny program, a nie coś typowego, ale to mój pierwszy.

Rozmiar: 81128 (32B) v 83672 (64b) - więc nie duża różnica

Speed: 17s(32B) v 24s (64B) - działa na 32-bitowym OS (OS-X 10.5.8)

Update:

Zauważam, że powstaje nowy hybrydowy x32 ABI (Application Binary Interface), który jest 64b, ale używa wskaźników 32b. W przypadku niektórych testów skutkuje to mniejszym kodem i szybszym wykonaniem niż 32B lub 64B.

Https://sites.google.com/site/x32abi/

Author: philcolbourn, 2010-03-04

8 answers

O ile nie potrzebujesz dostępu do większej ilości pamięci, na którą pozwoli Ci adresowanie 32b, korzyści będą niewielkie, jeśli w ogóle.

Podczas pracy na procesorze 64b, otrzymujesz ten sam interfejs pamięci bez względu na to, czy używasz kodu 32b czy 64B(używasz tej samej pamięci podręcznej i tej samej magistrali).

Chociaż Architektura x64 ma jeszcze kilka rejestrów, co pozwala na łatwiejsze optymalizacje, często jest to przeciwdziałane przez fakt, że wskaźniki są teraz większe, a użycie dowolnych struktur ze wskaźnikami skutkuje wyższym ruch pamięci. Szacuję, że wzrost ogólnego zużycia pamięci dla aplikacji 64b w porównaniu do aplikacji 32b wynosi około 15-30%.

 22
Author: Suma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-04 10:49:49

Zazwyczaj widzę 30% poprawę prędkości dla kodu intensywnie obliczeniowego na x86-64 w porównaniu do x86. Wynika to najprawdopodobniej z faktu, że mamy 16 x 64-bitowe rejestry ogólnego przeznaczenia i 16 x rejestry SSE zamiast 8 x 32-bitowych rejestrów ogólnego przeznaczenia i 8 x rejestrów SSE. Tak jest w przypadku kompilatora Intel ICC (11.1) na Linuksie x86-64-wyniki z innymi kompilatorami (np. gcc) lub z innymi systemami operacyjnymi (np. Windows), mogą być oczywiście inne.

 34
Author: Paul R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-05 08:52:11

Niezależnie od korzyści, sugerowałbym, abyś zawsze kompilował swój program dla domyślnego rozmiaru słowa systemu (32-bit lub 64-bit), ponieważ jeśli skompilujesz bibliotekę jako 32-bitową binarną i dostarczysz ją na 64-bitowym systemie, zmusisz każdego, kto chce połączyć się z Twoją biblioteką, aby udostępnił swoją bibliotekę (i wszelkie inne zależności bibliotek) jako 32-bitową binarną, gdy Wersja 64-bitowa jest domyślną dostępną. To może być dość uciążliwe dla wszystkich. W razie wątpliwości należy podać zarówno wersje twojej Biblioteki.

Co do praktycznych zalet 64-bitowych... najbardziej oczywiste jest to, że masz większą przestrzeń adresową, więc jeśli mmap plik, można adresować więcej go na raz (i załadować większe pliki do pamięci). Inną korzyścią jest to, że zakładając, że kompilator wykonuje dobrą robotę optymalizacji, wiele operacji arytmetycznych może być równoległych (na przykład umieszczenie dwóch par 32-bitowych liczb w dwóch rejestrach i wykonywanie dwóch dodań w operacji pojedynczego dodawania), a duża liczba obliczenia przebiegną szybciej. To powiedziawszy, całe 64-bitowe vs 32-bitowe coś nie pomoże Ci w asymptotycznej złożoności w ogóle, więc jeśli chcesz zoptymalizować swój kod, powinieneś prawdopodobnie patrzeć na algorytmy, a nie na stałe czynniki takie jak ten.

EDIT :
Proszę pominąć moją wypowiedź o równoległym dodaniu. Nie jest to wykonywane przez zwykłe polecenie add... Pomyliłem to z niektórymi wektoryzowanymi instrukcjami/SSE. A more dokładną korzyścią, poza większą przestrzenią adresową, jest to, że istnieją bardziej uniwersalne rejestry, co oznacza, że więcej zmiennych lokalnych może być utrzymywanych w pliku rejestru CPU, do którego dostęp jest znacznie szybszy niż w przypadku umieszczenia zmiennych w stosie programu (co zwykle oznacza wyjście do pamięci podręcznej L1).

 14
Author: Michael Aaron Safyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-05 04:19:22

Oprócz większej liczby rejestrów, 64-bit posiada domyślnie SSE2. Oznacza to, że niektóre obliczenia można wykonywać równolegle. Rozszerzenia SSE miały też inne gadżety. Ale myślę, że główną korzyścią jest brak konieczności sprawdzania obecności rozszerzeń. Jeśli jest to x64, ma Dostępny SSE2. ...Jeśli dobrze pamiętam.

 3
Author: amokcrow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-21 12:55:10

W konkretnym przypadku x68 do x68_64, 64-bitowy program będzie mniej więcej tego samego rozmiaru, jeśli nie nieco mniejszy, będzie zużywał nieco więcej pamięci i działał szybciej. Głównie dlatego, że x86_64 nie tylko ma 64-bitowe rejestry, ale także ma dwa razy więcej. x86 nie ma wystarczającej ilości rejestrów, aby skompilowane języki były tak wydajne, jak to tylko możliwe, więc kod x86 spędza dużo instrukcji i przepustowości PAMIĘCI przenosząc dane tam i z powrotem między rejestrami i pamięcią. x86_64 ma tego znacznie mniej, i tak zajmuje trochę mniej miejsca i działa szybciej. Instrukcje zmiennoprzecinkowe i wektorowe są również znacznie wydajniejsze w x86_64.

Ogólnie rzecz biorąc, kod 64-bitowy niekoniecznie jest szybszy i zwykle jest większy, zarówno dla kodu, jak i pamięci w czasie wykonywania.

 2
Author: Andrew McGregor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-04 10:44:04

Jedynym uzasadnieniem dla przeniesienia aplikacji do 64-bitowej jest potrzeba większej pamięci w aplikacjach, takich jak duże bazy danych lub aplikacje ERP z co najmniej 100 jednoczesnych użytkowników, gdzie limit 2 GB zostanie dość szybko przekroczony, gdy aplikacje buforują się dla lepszej wydajności. Dzieje się tak szczególnie w przypadku systemu operacyjnego Windows, gdzie integer I long są nadal 32-bitowe (mają nową zmienną _int64. Tylko wskaźniki są 64-bitowe. W rzeczywistości WOW64 jest wysoce zoptymalizowany w systemie Windows x64, dzięki czemu działają aplikacje 32-bitowe z niską karą na 64-bitowym systemie operacyjnym Windows. Moje doświadczenie na Windows x64 to 32-bitowa wersja aplikacji uruchamiana 10-15% szybciej niż 64-bitowa, ponieważ w poprzednim przypadku przynajmniej dla zastrzeżonych baz danych pamięci można użyć pointer arithmatic do utrzymania b-tree (najbardziej intensywnej procesorowo części systemów bazodanowych). Intensywne aplikacje kompuatacyjne, które wymagają dużych dziesiętnych dla najwyższej dokładności, której nie zapewnia podwójne na 32-64-bitowym systemie operacyjnym. Te aplikacje mogą używać _int64 w sposób natywny zamiast emulacja oprogramowania. Oczywiście duże bazy danych oparte na dyskach również wykazują poprawę w stosunku do 32-bitowych po prostu ze względu na możliwość korzystania z dużej pamięci do buforowania planów zapytań i tak dalej.

 2
Author: GirishK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-02 03:20:44

Więcej danych jest przesyłanych pomiędzy procesorem i pamięcią RAM dla każdego pobierania pamięci (64 bity zamiast 32), więc programy 64-bitowe mogą być szybsze, pod warunkiem, że są napisane tak, aby prawidłowo z tego skorzystały.

 1
Author: Rune Aamodt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-04 10:39:21

Wszelkie aplikacje, które wymagają użycia procesora, takie jak transkodowanie, wydajność wyświetlania i renderowanie multimediów, czy to audio czy wizualne, z pewnością będą wymagać (w tym momencie) i korzystać z używania 64 bitów w porównaniu z 32 bitami ze względu na zdolność procesora do radzenia sobie z ogromną ilością danych wyrzucanych na niego. To nie tyle kwestia przestrzeni adresowej, co sposobu postępowania z danymi. 64-bitowy procesor, biorąc pod uwagę kod 64-bitowy, będzie działał lepiej, zwłaszcza z matematycznie trudne rzeczy, takie jak transkodowanie i dane VoIP - w rzeczywistości wszelkiego rodzaju aplikacje "matematyczne" powinny korzystać z 64-bitowych procesorów i systemów operacyjnych. Udowodnij, że się mylę.

 0
Author: Dave Vanian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-16 09:33:49