P6 아키텍처 - 레지스터 이름 변경을 제외하고 제한된 사용자 레지스터로 인해 더 많은 OPS가 쏟아지는/로드가 발생합니까?

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

문제

동적 언어 VM 구현과 관련하여 JIT 디자인을 연구하고 있습니다. 나는 8086/8088 일 이후로 많은 조립을하지 않았으며, 여기저기서 조금만 있었으므로 일종의 시간이 없다면 친절하십시오.

내가 이해 한 바와 같이, X86 (IA-32) 아키텍처는 오늘날에도 항상 동일한 기본 제한 레지스터가 설정되어 있지만 내부 레지스터 수는 엄청나게 증가했지만 이러한 내부 레지스터는 일반적으로 사용할 수 없으며 레지스터 이름 변경과 함께 사용됩니다. 평행 할 수없는 코드의 병렬 파이프 라인을 달성합니다. 나는이 최적화를 잘 이해하지만 내 느낌은 전반적인 처리량과 병렬 알고리즘에 도움이되는 반면, 제한된 레지스터 세트는 여전히 X86이 더블 또는 4 배의 레지스터를 가질 수 있도록 더 많은 레지스터를 쏟아 부었습니다. 우리에게 제공되면 일반적인 지시 스트림에서 푸시/팝 오코드가 훨씬 적을 수 있습니까? 아니면 내가 알지 못하는 것을 최적화하는 다른 프로세서 옵트미즈가 있습니까? 기본적으로 정수 작업을 위해 작업 할 4 개의 레지스터가있는 코드 단위를 사용하는 경우, 내 장치에는 12 개의 변수가 있습니다. 2 개 정도의 지침마다 푸시/팝이 있습니다.

연구에 대한 언급, 또는 더 나은 개인적인 경험이 있습니까?

편집 : x86_64에는 16 개의 레지스터가 있으며 이는 이중 x86-32이며 수정 및 정보에 감사드립니다.

도움이 되었습니까?

해결책

지침 대기 시간으로 인해 거품을 숨기기 위해 레지스터를 바꾸는 것 외에도 대부분의 X86 아키텍처는 푸시 및 팝을 계산하고 레지스터로 이름을 바꿀 수있을만큼 똑똑합니다. X86의 명령 디코더는 실제로 일종의 JIT 컴파일을 수행하여 X86 명령 스트림을 트레이스 캐시에 저장된 작은 마이크로 코드 프로그램으로 바꿉니다. 이 프로세스의 일부에는 작은 오프셋 스택 하중을 가로 채고 레지스터로 전환하는 것이 포함됩니다. 따라서 (특허 적으로 어리 석고 순전히)와 비슷한 것 : :

lwz eax,[ebp]
lwz ebx,[ebp+4]
add eax,[edx+0]
push eax 
lwz eax,[ebp+8]
add eax,ebx
pop ebx
add eax,ebx

요리사는 (내부 레지스터가 명명 된 척 예를 들어 R0..R16) :

lw r3, edx
lw r1, ebp
lw r2, ebp+4 ; the constant '4' is usually stored as an immediate operand
add r1,r2
or r4,r1,r1 ;; move r1 to r4
lw r1, ebp+8
add r1,r2
or r2,r4,r4
add r1,r2

물론 마술처럼 똑똑한 디코더 (실제로 트랜지스터 카운트에 맞는 것과는 달리)는 불필요한 움직임 중 일부가 붕괴 될 것이지만, 내가 만드는 요점은 푸시/팝 및 저장/로드입니다. esp+(some small number) 실제로 그림자 레지스터로 바뀝니다.

다른 팁

두 가지 점 :

(1) x86-64는 레지스터 수를 16으로 두 배로 늘립니다.

(2) 현대 x86 CPU에서는 이미 L1 캐시에있는 메모리 위치를 사용하는 지침이 거의 레지스터 피연산자와 동일한 작업과 동일한 작업과 마찬가지로 L1을 "레지스터 메모리"로 생각할 수 있습니다.

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