64 비트 기계에 32 비트 운영 체제를 설치함으로써 대역폭이 개선 되었습니까?

StackOverflow https://stackoverflow.com/questions/254368

문제

Knuth 최근에 반대했다 64 비트 시스템으로, 4 개의 메모리에 맞는 프로그램의 경우 포인터가 32 비트 시스템에서 두 배나 크기 때문에 "캐시의 절반을 효과적으로 버리십시오"라고 말합니다.

내 질문은 : 64 비트 기계에 32 비트 운영 체제를 설치 하여이 문제를 피할 수 있습니까? 그리고이 경우 이점을 보여주는 대역폭 집약적 인 벤치 마크가 있습니까?

도움이 되었습니까?

해결책

대답은 : 성능 차이가 좋지는 않지만 어느 정도는 가능합니다.

이 테스트를위한 벤치 마크는 많은 포인터 해상도를 수행해야하므로 노이즈와 분리하기가 어렵습니다. 최적화되지 않는 벤치 마크를 설계하는 것은 어렵습니다. 결함이있는 Java 벤치 마크에 대한이 기사 다른 질문에 대한 응답으로 누군가가 게시했지만 그에 설명 된 많은 원칙이 이에 적용됩니다.

다른 팁

대역폭은 실제로 올바른 용어가 아닙니다. Knuth가 실제로 이야기했던 것은 캐시 발자국과 관련하여 데이터 밀도였습니다. 16KB L1 데이터 캐시가 있다고 상상해보십시오. 순전히 포인터를 저장하는 경우 2^14/2^2^2^12 = 4096 32 비트 포인터를 저장할 수 있지만 2048 64 비트 포인터 만 저장할 수 있습니다. 응용 프로그램의 성능이 2K 이상의 다른 버퍼를 추적 할 수있는 경우 32 비트 주소 공간에서 실제 성능 혜택을 볼 수 있습니다. 그러나 대부분의 실제 코드는 이러한 방식이 아니며 캐싱 시스템의 실제 성능 혜택은 종종 공통 정수 및 부동 소수점 데이터 구조를 캐시 할 수있는 경우가 많으며 대량의 포인터가 아닙니다. 작업 세트가 포인터가 무겁지 않은 경우 64 비트의 단점은 무시할 수 있으며 64 비트 정수 산술을 많이 수행하면 상승세가 훨씬 더 분명해집니다.

나는 Knuth가 64 비트 시스템에 반대했다고 생각하지 않습니다. 그는 방금 4GB RAM 미만의 시스템에서 64 비트 포인터를 사용하는 것이 바보라고 말했다 (적어도 이중 연결 목록에있는 것과 같은 포인터가 많으면). 나는 그에게 동의한다고 말할 수 없다. 여기에 취할 수있는 3 가지 방법이있다. 인텔 코어 듀오와 같이 32 비트 모드로도 실행할 수있는 64 비트 유능한 CPU가 있다고 가정 해 봅시다.

1- 모든 것이 32 비트, OS, AppZ 등입니다. 따라서 32 비트 포인터가 있지만 64 비트 모드에서 사용할 수있는 추가 레지스터/지침을 사용할 수 없습니다.

2- 모든 것이 64 비트, OS, AppZ 등입니다. 따라서 64 비트 포인터가 있으며 64 비트 모드에서 사용할 수있는 추가 레지스터/지침을 사용할 수 있습니다. 그러나 4GB 미만의 RAM이 있으므로 64 비트 포인터를 사용하는 것은 바보처럼 보입니다. 그러나 그것은입니까?

3 -OS는 64 비트이며 OS는 모든 코드/데이터 포인터가 0x00000000-0xffffffff 범위 (가상 메모리 !!!)에 있는지 흥미롭게도합니다. ABI는 메모리/파일에 보관 된 모든 코드/데이터 포인터의 폭이 32 비트이지만 확장되지 않은 64 비트 레지스터에로드되는 매우 이상한 방식으로 실행됩니다. 점프 할 코드 위치가있는 경우 컴파일러/ABI는 필요한 수정을 수행하고 실제 64 비트 점프를 수행합니다. 이런 식으로 포인터는 32 비트이지만 APPZ는 64 비트가 될 수 있으며 64 비트 레지스터 및 지침을 사용할 수 있습니다. 이 과정은 Thunking과 같은 것입니다.

내 결론은 ::

세 번째 옵션은 나에게 할 수있는 것처럼 보였지만 쉬운 문제는 아닙니다. 이론적으로는 효과가 있지만 나는 그것이 가능하다고 생각하지 않습니다. 또한 그의 인용문은 "그러한 포인터 값이 구조물 내부에 나타날 때 메모리의 절반을 낭비 할뿐만 아니라 캐시의 절반을 효과적으로 버릴 것"이라고 생각합니다. 과장되었습니다 ...

최고의 믹스 (X86 CPU)는 64 비트 OS와 32 비트 응용 프로그램을 사용하는 것입니다.

64 비트 OS를 사용하면 다음과 같습니다.

  • 4GB 이상의 주소 공간을 처리하는 기능
  • 더 큰 인수는 데이터를 사용하는 운영에 도움이됩니다

32 비트 앱을 사용하면 다음과 같습니다.

  • 작은 포인터
  • 컨텍스트 스위치에 저장할 수있는 더 작은 레지스터

단점 :

  • 모든 라이브러리는 복제되어야합니다. HD 공간 표준에 의한 작은.
  • 로드 된 모든 라이브러리는 RAM에서 복제됩니다. 너무 작지 ...

놀랍게도 모드를 전환 할 때 오버 헤드가없는 것 같습니다. 사용자 공간에서 커널로 나누는 것은 사용자 공간의 비록에 관계없이 동일합니다.

물론 큰 주소 공간의 혜택을받는 일부 응용 프로그램이 있습니다. 그러나 다른 모든 것에 대해 32 비트를 유지하여 5%의 성능을 높일 수 있습니다.

그리고 아니, 나는이 작은 속도를 신경 쓰지 않는다. 그러나 그것은 64 비트 Kubuntu 기계에서 32 비트 Firefox를 실행하는 것을 "불쾌하게"하지 않습니다 (일부 포럼에서 본 것처럼)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top