1

컴파일러와 관련된 책을 읽었을 때 두 가지 주요 메모리 모델이 있음을 확인했습니다.메모리 모델에 대한 질문

등록 모델 및 메모리를 메모리 모델에 등록하십시오.

이 책에서 레지스터 간 모델은 레지스터 수에 대한 시스템 제한을 무시하고 컴파일러 백엔드는로드 및 저장을 삽입해야한다고 말합니다. register-to-register 모델은 가상 레지스터를 사용할 수 있기 때문에 ...이 모델은 레지스터에 저장할 수있는 모든 값을 유지하므로 완료하기 전에로드 및 저장 (메모리 관련)을 삽입해야합니까?

또한 메모리 대 메모리 부분에서 컴파일러 백 엔드는 중복로드 및 저장소를 제거 할 수 있다고 말합니다. 그것은 모델이 최적화를 위해 여분의 메모리 사용을 제거해야한다는 것을 의미합니까?

답변

0

나는 당신이 당신이 읽고 있다고 말한 것이기 때문에 컴파일러의 문맥에서 당신의 질문에 대답 할 것입니다. 컴퓨터 아키텍처 컨텍스트에서 이러한 대답은 이 아니므로이 적용되므로주의해서 읽으십시오.

레지스터 - 투 - 레지스터 모델은 가상 레지스터를 사용할 수 있기 때문에 그렇습니까?이 모델은 레지스터에 저장할 수있는 모든 값을 유지하므로 완료 전에로드 및 저장 (메모리 관련)을 삽입해야합니다?

그럴 가능성이 있습니다. 기본 머신이 레지스터/레지스터 연산을 지원하지 않으면 "가상 레지스터"연산을로드 및 저장으로 변환해야합니다. 마찬가지로 IR 단계에서 컴파일러가 무한 레지스터 시스템을 사용하는 경우 레지스터 할당 단계에서 일부 레지스터를 메모리로 유출해야 할 수도 있습니다 (레지스터에서 무한한 가상 레지스터 집합을 실제 레지스터의 유한 집합으로 매핑하고 메모리가 부족할 때 메모리 액세스).

최적화를 위해 여분의 메모리 사용을 제거해야한다는 의미입니까?

예, 이것은 컴파일러가 최적화 단계로 수행 할 수있는 작업입니다. 이것은 단순히 대신 레지스터의 값을 떠날 최적화 할 수 있습니다

register1 <- LOAD 1234 
// Operation using register 1 that leaves the result in register 1 
STORE register1, 1234 
register1 <- LOAD 1234 
// Another operation that uses register 1 
STORE register1, 1235 

,이 같은 : 우리는 같은 것을 할 경우

register1 <- LOAD 1234 
// Operation using register 1 that leaves the result in register 1 
// Another operation that uses register 1 
STORE register1, 1235 

이 분명히 더 효율적이다 추가적인 DRAM 그 액세스 피할 수 있기 때문에 레지스터와 비교할 때 속도가 느립니다.