일단 요즘 CPU는 RAM에 비해서 속도가 워낙 (수백배?) 빠르기 때문에, CPU의 기다리는 시간을 최대한 줄이기 위해 연산장치와 메모리 사이에 캐시를 삼단계는 끼워 넣습니다. 그러니까 교과서에 나오는 그림은 "1980년대의 CPU는 이런 식으로 동작했습니다" 정도로 이해하시면 되고 너무 디테일에 연연하지 않는 게 좋습니다.
그나저나 그건 그렇다 치고, CPU가 명령을 메모리에서 읽어오고 *그 다음에* 데이터를 가져와야 하는 이유는 간단합니다. 일단 명령을 먼저 읽어서 해석을 해야 데이터를 어디에서 읽을지 알 것 아닙니까.
case-by-case이고 architecture dependent 입니다.
명령을 읽고(fetch) 그 명령이 요구하는 데이터가 cache에 있는지 확인하고 없으면 메모리를 읽어서 캐쉬에 로드한 후 다시 가져오고, 경우에 따라 한 클럭에 따라 가능할 수도 있긴 있는데 cache에 없는 경우 수백 사이클은 금방 지나가겠죠. 그때 다른 가용한 명령을 처리하고 그런 식으로 되어 있습니다.
완전히 고정되어 동작하게 되어 있지 않습니다. 특히 cache가 들어오면서 정확히 몇 사이클 내에 뭐가 된다는 개념은 성립되지 않습니다. 그런게 정말 필요하다면 cache를 비활성화해야 비슷해 질 것 같네요.
글쓴이: Stephen Kyoungw... / 작성시간: 금, 2020/05/15 - 7:59오전
질문을 이해해 보건데 한 사이클 내에 명령어와 그 명령어가 사용하는 메모리 데이터를 가져올 수 있느냐는 것 같습니다. 아키텍쳐와 관계없이 거의 불가능하다고 판단됩니다.
당연히 cache miss가 L1에서 나는 모든 경우는 훨씬 많은 사이클이 지나갑니다. 제가 이해하기엔 그렇다고 context switching을 cache miss 때문에 하진 않을 테니 수백 사이클까진 아니고 수십 사이클 단위일 것 같습니다.
보통 address에서 implicit하게나 explicit하게 register를 참조하는 경우는 일단 register를 읽어야 합니다. 예컨대, 직접적으로 register를 base address로 사용하는 명령 뿐 아니라 PC relative로 immediate field를 쓰는 경우라도 레지스터를 읽는데, clock-synchronized되어 있으니 같은 사이클 내에는 나올 수 없습니다.
가능한 경우는 instruction이 clock이 떠서 파이파 라인을 넘어오는 그 순간에 address 전체가 instruction register의 아웃풋으로 나오고, 캐쉬가 combinational logic이라서 그 사이클 내에 아웃풋에 데이터가 잡히는 경우일 텐데, 일단 캐쉬가 combinational logic인 경우는 보통의 프로세서에서는 없을 것 같습니다. 그래서 address input까지는 백번 양보해서 instruction이 valid한 그 사이클 내에 전달된다 쳐도--이것도 안 되리라 생각합니다만--거기서 데이터는 같은 사이클 내에 나오기 어렵습니다.
...
일단 요즘 CPU는 RAM에 비해서 속도가 워낙 (수백배?) 빠르기 때문에, CPU의 기다리는 시간을 최대한 줄이기 위해 연산장치와 메모리 사이에 캐시를 삼단계는 끼워 넣습니다. 그러니까 교과서에 나오는 그림은 "1980년대의 CPU는 이런 식으로 동작했습니다" 정도로 이해하시면 되고 너무 디테일에 연연하지 않는 게 좋습니다.
그나저나 그건 그렇다 치고, CPU가 명령을 메모리에서 읽어오고 *그 다음에* 데이터를 가져와야 하는 이유는 간단합니다. 일단 명령을 먼저 읽어서 해석을 해야 데이터를 어디에서 읽을지 알 것 아닙니까.
명령어를 읽고 데이터를 가져오는 과정이 한 클럭
명령어를 읽고 데이터를 가져오는 과정이 한 클럭 사이에 일어나지 않나요?
한 클럭 안에서 메모리에 두 번 접근한다고 생각이 들어서요
case-by-case이고 architecture
case-by-case이고 architecture dependent 입니다.
명령을 읽고(fetch) 그 명령이 요구하는 데이터가 cache에 있는지 확인하고 없으면 메모리를 읽어서 캐쉬에 로드한 후 다시 가져오고, 경우에 따라 한 클럭에 따라 가능할 수도 있긴 있는데 cache에 없는 경우 수백 사이클은 금방 지나가겠죠. 그때 다른 가용한 명령을 처리하고 그런 식으로 되어 있습니다.
완전히 고정되어 동작하게 되어 있지 않습니다. 특히 cache가 들어오면서 정확히 몇 사이클 내에 뭐가 된다는 개념은 성립되지 않습니다. 그런게 정말 필요하다면 cache를 비활성화해야 비슷해 질 것 같네요.
...
질문을 이해해 보건데 한 사이클 내에 명령어와 그 명령어가 사용하는 메모리 데이터를 가져올 수 있느냐는 것 같습니다. 아키텍쳐와 관계없이 거의 불가능하다고 판단됩니다.
당연히 cache miss가 L1에서 나는 모든 경우는 훨씬 많은 사이클이 지나갑니다. 제가 이해하기엔 그렇다고 context switching을 cache miss 때문에 하진 않을 테니 수백 사이클까진 아니고 수십 사이클 단위일 것 같습니다.
보통 address에서 implicit하게나 explicit하게 register를 참조하는 경우는 일단 register를 읽어야 합니다. 예컨대, 직접적으로 register를 base address로 사용하는 명령 뿐 아니라 PC relative로 immediate field를 쓰는 경우라도 레지스터를 읽는데, clock-synchronized되어 있으니 같은 사이클 내에는 나올 수 없습니다.
가능한 경우는 instruction이 clock이 떠서 파이파 라인을 넘어오는 그 순간에 address 전체가 instruction register의 아웃풋으로 나오고, 캐쉬가 combinational logic이라서 그 사이클 내에 아웃풋에 데이터가 잡히는 경우일 텐데, 일단 캐쉬가 combinational logic인 경우는 보통의 프로세서에서는 없을 것 같습니다. 그래서 address input까지는 백번 양보해서 instruction이 valid한 그 사이클 내에 전달된다 쳐도--이것도 안 되리라 생각합니다만--거기서 데이터는 같은 사이클 내에 나오기 어렵습니다.
...
그 명령어가 사용하는 데이터는 그 명령어를 읽는 사이클에 메모리에서 가져올 수 없습니다. 캐쉬의 유무와도 관계 없습니다. 하드웨어 설계상 이게 되려면 극단적인 가정이 필요한데, 그렇게 만들어지는 프로세서는 현실에서 거의 없을 겁니다. (아주 없을 수도 있습니다.)
댓글 달기