programing

성능 32비트 대 64비트 산술

bestprogram 2023. 10. 19. 22:37

성능 32비트 대 64비트 산술

토박이64 bit그것들보다 느린 정수 산술 명령어들32 bit상대편 (에 대하여)x86_64기계로.64 bitOS)?

편집: 인텔 Core2 Duo, i5/i7 등 현재 CPU에서

정확한 CPU와 동작에 따라 달라집니다.예를 들어 64비트 펜티엄 IV의 경우 64비트 레지스터의 곱셈이 상당히 느렸습니다.코어 2 이상의 CPU는 처음부터 64비트 동작이 가능하도록 설계되었습니다.

일반적으로 64비트 플랫폼용으로 작성된 코드라도 값이 들어가는 32비트 변수를 사용합니다.이것은 주로 산술 속도가 더 빠르기 때문이 아니라(현대 CPU에서는 일반적으로 그렇지 않기 때문입니다) 메모리 및 메모리 대역폭을 덜 사용하기 때문입니다.

12개의 정수를 포함하는 구조는 64비트보다 32비트일 경우 크기가 절반이 됩니다.즉, 저장하는 데 바이트 수는 절반, 캐시 공간은 절반 등이 소요됩니다.

값이 32비트에 들어가지 않을 수 있는 경우 64비트 네이티브 레지스터와 산술이 사용됩니다.그러나 주요 성능 이점은 x86_64 명령어 세트에서 사용할 수 있는 추가 범용 레지스터에서 얻을 수 있습니다.물론 64비트 포인터에서 얻을 수 있는 모든 이점이 있습니다.

그래서 진짜 답은 그것이 중요하지 않다는 것입니다.x86_64 모드를 사용하더라도 32비트 산술을 사용할 수 있으며 더 큰 포인터와 더 일반적인 목적 레지스터의 이점을 얻을 수 있습니다.64비트 네이티브 작업을 사용할 때는 64비트 작업이 필요하기 때문입니다. 따라서 32비트 작업을 여러 개로 조작하는 것보다 빠를 것입니다. 다른 선택 사항은 없습니다.따라서 32비트 레지스터와 64비트 레지스터의 상대적 성능이 구현 결정에 결정적인 요소가 되어서는 절대 안 됩니다.

방금 이 질문을 우연히 발견했지만, 여기서 한 가지 매우 중요한 측면이 없는 것 같습니다. 인덱스에 대한 'int' 유형을 사용하여 어셈블리 코드를 실제로 들여다보면 컴파일러가 생성하는 코드의 속도가 느려질 가능성이 높습니다.이는 많은 64비트 컴파일러 및 플랫폼(Visual Studio, GCC)에서 'int'가 기본값인 32비트 유형이고 포인터(64비트 OS에서는 64비트여야 함)와 'int'로 주소 계산을 수행하면 컴파일러가 32비트와 64비트 레지스터 간의 불필요한 변환을 수행하게 되기 때문입니다.제 코드의 성능이 중요한 내부 루프에서 이를 경험했습니다.루프 인덱스로 'int'에서 'long long'으로 전환하면 알고리즘 실행 시간이 약 10% 향상되었습니다. 이는 제가 이미 그 시점에서 사용하고 있던 광범위한 SSE/AVX2 벡터화를 고려하면 상당히 큰 이득이었습니다.

주로 32비트 응용 프로그램(32비트 산술만 사용되고 32비트 포인터로 충분함을 의미함)에서 x86-64 아키텍처의 실질적인 이점은 아키텍처에 대한 AMD의 다른 "업데이트"입니다.

  • 16개의 범용 레지스터, x86의 8개보다 증가
  • RIP 상대 주소 지정 모드
  • 다른 사람들은...

이는 리눅스에 구현된 새로운 x32 ABI를 통해 명확히 알 수 있습니다.

언급URL : https://stackoverflow.com/questions/8948918/performance-32-bit-vs-64-bit-arithmetic