64 비트 프로그램이 32 비트 버전보다 크고 빠릅니까?


84

x86에 초점을 맞추고 있다고 생각하지만 일반적으로 32 비트에서 64 비트로 이동하는 데 관심이 있습니다.

논리적으로, 어떤 경우에는 상수와 포인터가 더 커져 프로그램이 더 커질 수 있음을 알 수 있습니다. 효율성을 위해 단어 경계에 메모리를 할당하려는 욕구는 할당 사이에 더 많은 공백을 의미합니다.

또한 x86의 32 비트 모드는 중첩되는 4G 주소 공간으로 인해 컨텍스트 전환시 캐시를 플러시해야한다고 들었습니다.

그렇다면 64 비트의 실제 이점은 무엇입니까?

그리고 보충 질문으로 128 비트가 더 좋을까요?

편집하다:

방금 첫 32/64 비트 프로그램을 작성했습니다. 16 바이트 (32b 버전) 또는 32 바이트 (64b 버전) 개체의 연결 목록 / 트리를 만들고 stderr에 많은 인쇄를 수행합니다. 정말 유용한 프로그램은 아니지만 일반적인 것은 아니지만 첫 번째 작업입니다.

크기 : 81128 (32b) v 83672 (64b)-큰 차이가 없습니다.

속도 : 17s (32b) v 24s (64b)-32 비트 OS (OS-X 10.5.8)에서 실행

최신 정보:

64b이지만 32b 포인터를 사용하는 새로운 하이브리드 x32 ABI (Application Binary Interface)가 개발 중이라는 점에 주목합니다. 일부 테스트의 경우 32b 또는 64b보다 코드가 작고 실행 속도가 빠릅니다.

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



1
그리고 내 다시 며칠을 froma : stackoverflow.com/questions/2334148/...
미스터 보이

동의하지만 CPU 캐시와 128 비트 부분에 대해서는 아직 겹치는 부분이 있습니다. 링크에 대해 Suma와 John에게 감사드립니다.
philcolbourn 2010 년


"나는 또한 x86의 32 비트 모드가 4G 주소 공간이 겹칠 수 있기 때문에 컨텍스트 전환시 캐시를 플러시해야한다고 들었습니다." 이에 대해 설명하는 참고 자료를 알려 주시겠습니까?
gkb0986 2013-09-05

답변:


29

32b 주소 지정이 허용하는 것보다 더 많은 메모리에 액세스해야하는 경우가 아니면 이점이 적습니다.

64b CPU에서 실행하는 경우 32b 또는 64b 코드를 실행하더라도 동일한 메모리 인터페이스를 얻게됩니다 (동일한 캐시와 동일한 BUS를 사용하고 있음).

x64 아키텍처에는 더 쉽게 최적화 할 수있는 레지스터가 몇 개 더 있지만 이는 포인터가 이제 더 커지고 포인터가있는 구조를 사용하면 메모리 트래픽이 증가한다는 사실에 의해 종종 해결됩니다. 32b 응용 프로그램에 비해 64b 응용 프로그램의 전체 메모리 사용량이 15-30 % 정도 증가 할 것으로 예상합니다.


2
제안 된 x32 ABI에 대한 귀하의 견해는 무엇입니까?
philcolbourn

memcpy와 strcpy는 64 비트 CPU에서 한 단어가 8 바이트이기 때문에 매번 한 단어를 읽을 것이기 때문에 32 비트 CPU보다 빠를 것이라고 생각합니다
Mark Ma

43

일반적으로 x86에 비해 x86-64에서 컴퓨팅 집약적 인 코드의 속도가 30 % 향상됩니다. 이는 8 x 32 비트 범용 레지스터와 8 x SSE 레지스터 대신 16 x 64 비트 범용 레지스터와 16 x SSE 레지스터가 있다는 사실 때문일 가능성이 큽니다. 이것은 x86-64 Linux의 인텔 ICC 컴파일러 (11.1)를 사용하는 것입니다. 물론 다른 컴파일러 (예 : gcc) 또는 다른 운영 체제 (예 : Windows)의 결과는 다를 수 있습니다.


1
'컴퓨팅 집약적'이란 그래픽, 매트릭스, DFT를 의미합니까?
philcolbourn 2010 년

4
@phil : 예, 주로 이미지 처리, 대부분 정수 (고정 소수점), 많은 SIMD 코드 등
Paul R

64 비트 컴파일러는 SSE 레지스터를 사용하고 32 비트 컴파일러는 표준 ALU를 사용하는 것을 확인했습니다. 이로 인해 FP 너비 (64 대 80)가 더 좁아지고 추가 명령어가 추가되어 64 비트 코드가 더 빨라집니다.
IamIC

16

이점에 관계없이 라이브러리를 32 비트 바이너리로 컴파일하고 64 비트에서 제공하는 경우 항상 시스템의 기본 단어 크기 (32 비트 또는 64 비트)에 맞게 프로그램을 컴파일하는 것이 좋습니다. 64 비트 버전이 사용 가능한 기본값 인 경우 라이브러리와 링크하려는 모든 사용자가 라이브러리 (및 기타 라이브러리 종속성)를 32 비트 바이너리로 제공하도록 강제합니다. 이것은 모두에게 상당히 성가신 일이 될 수 있습니다. 확실하지 않은 경우 라이브러리의 두 버전을 모두 제공하십시오.

64 비트의 실질적인 이점에 관해서는 ... 가장 분명한 것은 더 큰 주소 공간을 확보한다는 것입니다. 따라서 파일을 mmap하면 한 번에 더 많은 주소를 지정할 수 있습니다 (더 큰 파일을 메모리에로드). 또 다른 이점은 컴파일러가 최적화 작업을 잘 수행한다고 가정하면 많은 산술 연산을 병렬화 할 수 있다는 것입니다 (예 : 두 쌍의 32 비트 숫자 쌍을 두 개의 레지스터에 배치하고 단일 추가 작업에서 두 ​​개의 추가 수행). 숫자 계산이 더 빨리 실행됩니다. 즉, 전체 64 비트 대 32 비트는 점근 적 복잡성에 전혀 도움이되지 않으므로 코드를 최적화하려는 경우 이와 같은 상수 요소보다는 알고리즘을 살펴 봐야 할 것입니다.

편집 :
병렬 추가에 대한 내 진술을 무시하십시오. 이것은 일반적인 add 문에 의해 수행되지 않습니다. 일부 벡터화 / SSE 명령과 혼동했습니다. 더 큰 주소 공간을 제외하고 더 정확한 이점은 더 많은 범용 레지스터가 있다는 것입니다. 즉, CPU 레지스터 파일에서 더 많은 로컬 변수를 유지할 수 있으며, 이는 변수를 프로그램 스택 (일반적으로 L1 캐시로 나가는 것을 의미 함).


> "예를 들어 두 쌍의 32 비트 숫자 쌍을 두 개의 레지스터에 배치하고 단일 추가 작업에서 두 ​​개의 추가를 수행합니다."이 작업을 수행하는 컴파일러가 있습니까? 또한 SSE 명령어를 사용하여 x86에서 동일한 작업을 수행 할 수있는 것 같습니다.
Suma

이러한 "두 개의 추가"를 더 생각하면 말도 안되며 컴파일러는이를 최적화로 수행 할 수 없습니다. 하위 32b에서 추가하면 상위 32b로 오버플로 될 수 있기 때문입니다. 이를 위해서는 SIMD 지침이 필요합니다.
Suma

예리하다면 64 비트 레지스터에서 여러 16 비트 산술을 할 수있을 것 같습니다. 지저분 해 보이지만 끝났을 것입니다.
philcolbourn 2010 년

'Constant Factors'-소리는 Brian Harvey가 말하는 것과 같습니다.
philcolbourn 2010 년

5

더 많은 레지스터를 갖는 것 외에도 64 비트에는 기본적으로 SSE2가 있습니다. 이것은 실제로 일부 계산을 병렬로 수행 할 수 있음을 의미합니다. SSE 확장에는 다른 장점도있었습니다. 그러나 주요 이점은 확장 기능이 있는지 확인할 필요가 없다는 것입니다. x64 인 경우 SSE2를 사용할 수 있습니다. ... 내 기억이 올바르게 봉사한다면.


4

저는 foolsmate 라는 체스 엔진을 코딩하고 있습니다. 최소값 기반 트리 검색을 사용하여 깊이 9 (특정 위치에서)로 이동하는 가장 좋은 방법은 다음과 같습니다.

Win32구성 : ~ 17.0s;

x64구성으로 전환 한 후 : ~ 10.3s;

이것은 가속의 41 % 입니다!


2

애플리케이션을 64 비트로 이동하는 이유는 애플리케이션이 더 나은 성능을 위해 캐시 할 때 2GB 제한이 상당히 빠르게 초과되는 동시 사용자가 100 명 이상인 대규모 데이터베이스 또는 ERP 애플리케이션과 같은 애플리케이션에서 더 많은 메모리가 필요하다는 것입니다. 이것은 특히 integer 및 long이 여전히 32 비트 인 Windows OS의 경우입니다 (새 변수 _int64가 있습니다. 포인터 만 64 비트입니다. 실제로 WOW64는 Windows x64에서 고도로 최적화되어 32 비트 응용 프로그램이 64 비트 Windows에서 낮은 패널티로 실행됩니다. OS. Windows x64에서의 경험은 32 비트 응용 프로그램 버전이 64 비트보다 10-15 % 더 빠르게 실행됩니다. 이전의 경우 적어도 독점 메모리 데이터베이스의 경우 b- 트리 (데이터베이스 시스템의 프로세서 집약적 인 부분)를 유지하기 위해 포인터 산술을 사용할 수 있기 때문입니다. . 32-64 비트 운영 체제에서 두 배로 감당할 수없는 최고의 정확도를 위해 큰 십진수가 필요한 계산 집약적 인 응용 프로그램입니다. 이러한 응용 프로그램은 소프트웨어 에뮬레이션 대신 기본적으로 _int64를 사용할 수 있습니다. 물론 대용량 디스크 기반 데이터베이스는 쿼리 계획을 캐싱하는 데 대용량 메모리를 사용할 수 있기 때문에 32 비트 이상의 개선을 보여줄 것입니다.


첫째, int실행 환경의 단어 크기에 관계없이 모든 곳에서 32 비트를 유지합니다. long64 비트 용으로 컴파일 할 때 어떤 컴파일러가 여전히 32 비트입니까? MSVC가이를 수행한다고 주장하십니까? AFAIK, 이것은 C ++ 11 표준에서도 [대략] 다룹니다 sizeof(long) == sizeof(void*). MSVC에 쉽게 액세스 할 수 없기 때문에 제가 틀렸다면 제발 저를 고쳐주세요.
Matthew Hall

3
@Matthew Hall : Windows 64 비트 운영 체제 표준이므로 MSVC는이 LLP64 모델을 따릅니다 (유닉스 버전의 경우 LP64와 비교). ( msdn.microsoft.com/en-us/library/3b2e7499(v=vs.100).aspx )를 참조하십시오 .
GirishK

1

각 메모리 페치 (32 비트 대신 64 비트)에 대해 CPU와 RAM간에 더 많은 데이터가 전송되므로 64 비트 프로그램은이를 적절히 활용하도록 작성하면 더 빠를 수 있습니다.


11
사실, 이것은 그렇지 않습니다. 메모리 버스는 어떤 폭이든 상관없이 프로세서 레지스터의 폭과 관련이 없습니다. 일부 32 비트 시스템은 한 번에 128 비트를 가져오고, 한 번에 32 비트를 가져 오는 64 비트 시스템이 있으며, 한 번에 8 비트 이하의 메모리를 가져 오는 32 비트 시스템도 있습니다.
Andrew McGregor

좋아요, 저는 그 사실을 몰랐습니다. 단일 mov 명령이 64 비트 CPU에서 64 비트를 전송하고 32 비트 CPU에서 32 비트를 전송하는 것이 맞지 않습니까? 따라서 A 지점에서 B 지점으로 많은 양의 메모리를 복사 할 때 최소한 64 비트 CPU에서 실행해야하는 mov 명령어가 더 적을 수 있습니다 (메모리 버스가 병목 현상 인 경우에도)?
Rune Aamodt 2010 년

2
많은 양의 메모리를 이동할 때 x86 및 x64 모두에서 128b SIMD 명령어를 사용합니다.
Suma

"한 번에 32 개를 가져 오는 64 비트 시스템"이란 정확히 무엇입니까? 몇 가지를 말 해주세요. 있다면 실제로 "64 비트 시스템"입니까?
Johnny

1

x68에서 x68_64까지의 특정 경우에 64 비트 프로그램은 크기가 약간 더 작지는 않지만 약간 더 많은 메모리를 사용하고 더 빠르게 실행됩니다. 대부분 이것은 x86_64에 64 비트 레지스터가있을뿐만 아니라 두 배나 많기 때문입니다. x86에는 컴파일 된 언어를 가능한 한 효율적으로 만들기에 충분한 레지스터가 없으므로 x86 코드는 레지스터와 메모리간에 데이터를 앞뒤로 이동하는 데 많은 명령과 메모리 대역폭을 소비합니다. x86_64는 그보다 훨씬 적기 때문에 약간의 공간을 차지하고 더 빠르게 실행됩니다. 부동 소수점 및 비트 트위들 링 벡터 명령어도 x86_64에서 훨씬 더 효율적입니다.

그러나 일반적으로 64 비트 코드는 런타임에 코드 및 메모리 사용량 모두에서 반드시 더 빠르지는 않으며 일반적으로 더 큽니다.


2
나는 당신이 말하는 요점을 잘 이해하지 못합니다. 처음에 (첫 번째 문장) 당신은 64 비트 프로그램이 일반적으로 더 빨리 실행될 것이라고 말하지만 마지막 문장은 "진짜가 아님"이라고 말하는 모든 것을 역행하는 것 같습니다
SN

1

오디오이든 시각적이든 관계없이 트랜스 코딩, 디스플레이 성능 및 미디어 렌더링과 같은 CPU 사용이 필요한 모든 응용 프로그램은 (이 시점에서) 분명히 필요하며 CPU의 순전 한 처리 능력으로 인해 32 비트 대비 64 비트를 사용하는 이점이 있습니다. 그것에 던져지는 데이터의 양. 데이터가 처리되는 방식이기 때문에 주소 공간의 문제가 아닙니다. 64 비트 코드가 제공되는 64 비트 프로세서는 특히 트랜스 코딩 및 VoIP 데이터와 같이 수학적으로 어려운 작업에서 더 나은 성능을 발휘할 것입니다. 실제로 모든 종류의 '수학'애플리케이션은 64 비트 CPU 및 운영 체제를 사용하여 이점을 얻을 수 있습니다. 내가 틀렸다는 것을 증명 해봐.


아니 . 그렇지 않습니다. RAM 요구 사항이 4GB를 초과하는 경우에만 더 빠릅니다. 32 비트 아키텍처에서 4GB 미만의 데이터에서 1000Millions 정수 배열을 쉽게 검색 할 수 있습니다. 따라서 여기에서 64 비트 머신을 사용하면 속도가 느려집니다
sapy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.