검색해보면 인텔의 경우 16k 아톰은 8k 단위로 instruction을 fetch한다고 하더군요.
이와 같이 cpu의 instruction fecth 단위가 정해지는 이유나 목적이 있는지 궁금합니다^^
댓글 5
-
tp
2013.10.07 10:08
-
박한범
2013.10.17 11:04
제가 실수했습니다!! 단위를 잘못 기재했네요!!
-
tp
2013.10.07 10:13
본래 글의 답이 빠졌군요.
cpu의 instruction fecth 단위가 정해지는 원리는 backend와 관련이 있습니다.
backend에서 instruction을 얼마나 수행하는지에 따라 frontend fetch size를 크게도 작게도 만듭니다.
in order execution인 경우 dependency 때문에 보통 작게 될 것이고
out-of order execution에 실행유닛도 많다면 frontend를 크게 설계할 것 입니다.
또한 fetch는 보통 버스쪽 data width size과도 연관 되어 있습니다.추측하건대 intel desktop 계열은 128b, atom계열은 64b 버스폭을 사용할 것으로 추측됩니다.
참고로 최근의 ARM도 128b 또는 64b을 주로 사용합니다.
참고로 bus폭은 주로 data load/store unit에 의해 결정됩니다.
-
박한범
2013.10.17 11:13
tp님 상세한 답변 감사드립니다~!
제가 메뉴얼을 좀 읽어보니 인텔제품군의 경우 펜티엄4부터 64비트를 적용해 놨더군요.
그리고 이 시점부터 64x2 해서 128비트의 instruction fetch 단위를 사용하기 시작한 것 같습니다.
추가 질문...
제가 의아했던 점이 뭐냐면, 상수가 있는 명령 구문의 경우 예를 들어
32비트 cpu라면 32비트 상수를 사용할 수 있다는 말 아니겠습니까?
만약 32비트 상수를 사용했는데, instruction fetch 단위가 4k라면
32비트 상수가 적용되어 있는 명령 구문은 어떻게 해도 추가 동작이 필요할 것입니다.
그런데 거듭 의아한 점은 이와 같은 동작이 추가 클럭이든 로드든 스토어든 필요치 않다는 점입니다.
정확히 imm32라고 기재된 것은 아니지만 imm이 들어간 구문
ex) mov r, imm
과 같은 구문이 mov r,r 과 같은 딱봐도 최소 동작이 가능한 구문과 동일 퍼포먼스를 낸다고
구글에서 찾은 자료에는 나와있습니다.
물론 간단히 생각해서 그 시대에는 상수 단위가 낮았겠지 라고 생각하면 될 일이지만
의아한건 여전하네요 ^_^ ㅎㅎ
-
tp
2013.10.18 08:53
IA-32가 CISC 기반이라는 것에서 답을 찾으시면 됩니다.
intel은 variable length instruction set을 사용합니다.
instruction에 따라 길이가 1B부터 8B이상(정확한 max size는 manual을 참고)까지 변합니다.
MOV Opcode와 레지스터 operand에 대한 encoding이 1 또는 2B 정도 일 것이고 상수가 뒤에 붙는 방식으로 encoding될 겁니다.
물론 내부 microOps을 처리하는 RISC 부분은 위의 명령어를 다른 방식으로 표현하겠지요.
참고로 intel 이외 architecture의 경우는 아래와 같습니다.
ARM의 경우는 단일 MOV 명령어로 32b 상수는 불가능 합니다. (여러개의 MOV 명령을 사용하여 표현은 가능)MOV는 imm8을 rotate한 값만 사용할 수 있고 full range 32b상수(예: 0x1234_5678)는 load로 구현합니다.
TI의 경우 movh movl같은 명령이 있어 16b를 위아래 따로 mov하는 방식의 instruction을 지원합니다.
.
개인적으로도 fetch를 저렇게 한다고 하는 경우를 못 본 것 같습니다.
http://www.agner.org/optimize/microarchitecture.pdf
위의 글을 보셔도 16B 혹은 8B로 fetch합니다.
http://www.anandtech.com/show/6355/intels-haswell-architecture/6
위의 글은 haswell의 frontend인데 4 wide fetch/decode라고 합니다.
대충 생각해봐도 8kB, 16kB씩 fetch할 이유가 별로 없습니다. 명령어 프로파일을 보면 일반적으로 branch명령이 10~20% 정도 차지합니다. 대부분의 경우 branch할 것이 뻔한데 불필요한 prefetch를 많이하도록 architecture를 만들지는 않을 것 같습니다.
ps. intel P4의 경우 trace cache 얘기가 이글과 상관있을지 모르겠다는 생각이 들기는 하는데 그래도 instruction fetch를 8kB씩 한다고 표현한 것은 용어가 잘못 사용된 글 같습니다.