본문 바로가기

시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리/17장: 메모리 모델

[Arm프로세서] Armv8: 노멀 메모리 타입이란

명령어를 실행하거나 명령어 실행 과정에서 처리되는 데이터나 코드는 노멀 메모리 타입으로 처리됩니다. 대부분의 소프트웨어 개발자가 입력한 코드는 노멀로 마킹된 메모리 영역에 로딩된다고 있습니다.

 

Arm 프로세서는 노멀 메모리로 마킹된 영역의 데이터를 처리하기 위해 캐싱 기법을 적용합니다.

CPU 노멀 메모리로 마킹된 메모리 영역에 대해 다음과 같은 기법을 적용해 최적화를 수행합니다.

 

l  머지 액세스

l  스페큘레이션(speculation)

l  리오더링 액세스

 

노멀 메모리를 처리하는 과정에서 적용되는 다양한 기법을 소개합니다.

 

머지 액세스

 

메모리 공간에 여러 접근하거나 연속된 메모리 공간에 접근하는 2 이상의 명령어를 번에 처리하는 동작을 머지 액세스(merge access)라고 합니다.

 

CPU 입장에서는 레지스터보다 메모리에 접근할 많은 사이클과 리소스를 사용합니다. 이유는 무엇일까요? 메모리에 접근하려면 메모리 버스에 먼저 접근해야 하며, DRAM 메모리 콘트롤러와 같은 메모리 하드웨어에서 부가적인 동작을 수행하기 때문입니다. 메모리에 액세스하는 횟수가 늘어날수록 이에 비례해 많은 사이클을 소모합니다. 따라서 메모리에 접근하는 횟수를 줄이면 시스템 성능을 높일 있습니다.

 

Arm 프로세서 내부에도 메모리에 액세스하는 횟수를 최소화해 성능을 높이는 메커니즘이 적용돼 있습니다.  예를 들어, 같은 주소 공간에 있는 메모리에 액세스하는 명령어가 있으면 이를 합쳐서 번만 메모리에 접근할 있습니다.

 

스페큘레이션 액세스

 

성능 최적화를 위한 다른 CPU 설계 기법은 스페큘레이션 액세스입니다. 소프트웨어에서 접근할 것으로 예상하는 데이터를 패턴 인식과 같은 알고리즘을 활용해 미리 예측해 미리 로딩하는 동작을 스페큘레이션 액세스라고 하며 이를 통해 성능을 높일 있습니다.  

 

밖에도 Arm 프로세서는 내부에서 분기 예측, 실행 예측을 통해 성능을 극대화하는  메커니즘이 적용되어 있습니다.

 

리오더링 액세스

 

Arm 프로세서는 성능을 향상하기 위해 프로세서 내부에서 명령어 실행 순서를 바꿔서 실행할 있습니다. 이를 위해 Arm 프로세서는 명령어 간에 의존성이 있는지 체크하며, 의존성이 없는 경우 명령어의 순서를 바꿔 처리합니다.

 

Arm 프로세서는 내부적으로 성능을 극대화하기 위해 다양한 기법을 적용해 왔습니다. 가운데 대표적인 기법은 "데이터 처리량을 높이기 위해 메모리 읽기 혹은 쓰기 작업을 재정렬(reorder)하는 동작"으로, 이를 메모리 리오더링이라고 합니다. 메모리 리오더링을 통해 프로세서와 외부 메모리 간의 데이터 처리량을 늘릴 있고, 결과 프로세서의 성능을 높일 있습니다.

 

앞에서 언급한 가지 동작 특성은 노멀 메모리 타입으로 마킹된 메모리 영역에 적용됩니다. 일반적으로 대부분 소프트웨어 개발자가 입력한 코드는 앞에서 언급한 가지 특징이 적용된 상태에서 실행됩니다.

 

 

[정보] 분기 예측과 실행 예측

 

최신 Arm 코어는 성능을 높이기 위해 분기 예측이나 실행 예측을 수행하기도 합니다. 이러한 CPU 코어의 특징을 악용해 해커들은 악의적인 코드나 데이터를 캐시에 남기려는 시도를 합니다. 이를 스펙터(spectre) 혹은 멜트다운(meltdown)이라고 합니다.

 

 

 

앞에서 설명한 특징을 가리켜 노멀 메모리 타입은 "Weakly ordered"라는 특징이 있다고 말합니다. 여기서 말하는 "Weakly ordered" 무엇일까요? 프로그램을 실행하면 메모리에 액세스하는데, 메모리 액세스 순서가 프로그램에 명시된 프로시저(실행 흐름) 같지 않다는 의미입니다.