오늘 끝나면
버스·중재·DMA
- ✓버스·중재·DMA의 핵심 문제를 한 문장으로 설명한다
- ✓오른쪽 실습에서 버스이 어떻게 움직이는지 관찰한다
- ✓다음 강의와 이어지는 한계를 말할 수 있다
실습 미션
여러 master의 경쟁 — arbitration·burst·우선순위 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.
성공 조건
- □실습의 기본값을 먼저 관찰
- □입력값이나 모드를 한 번 이상 바꿔 결과 비교
- □왜 결과가 바뀌었는지 한 문장으로 설명
반도체 설계 · 27
버스·중재
·DMA
칩 안의 길은 하나인데 쓰려는 놈은 여럿이다.
CPU·GPU·DMA가 같은 버스를 두고 다툰다.
누구를 먼저 보낼지 정하는 것이 중재(arbiter)다.
버스, 모두가 공유하는 한 줄
블록마다 메모리까지 전용 길을 깔면 배선이 폭발한다. 그래서 한 줄을 같이 쓴다. 그게 버스다.
버스는 칩 안의 공용 도로다. 주소선·데이터선·제어선 몇 가닥을 모든 블록이 나눠 쓴다.
여기 매달린 블록은 둘로 나뉜다.
master는 먼저 ‘이거 읽어, 써’라고 요청을 내는 쪽이다. CPU·GPU·DMA가 여기 속한다.
slave는 요청을 받아 응답만 하는 쪽이다. RAM·주변장치가 여기 속한다.
한 순간에는 한 master만 데이터선을 점유할 수 있다. 두 master가 동시에 버스를 쓰면 신호가 충돌한다.
그래서 누군가 순서를 정해줘야 한다. 그 일을 하는 것이 중재다.
중재, 동시에 손 들면 누구부터
여러 master가 같은 cycle에 버스를 요청한다. 한 줄뿐이니 한 명만 통과시켜야 한다. 그 심판이 arbiter다.
master들은 request선을 올려 ‘나 버스 줘’를 알린다.
arbiter는 그중 하나에게만 grant를 내준다. 받은 놈만 그 cycle에 버스를 점유한다.
나머지는 grant 받을 때까지 기다린다. 이 기다린 시간이 latency다.
누구부터 줄지는 정책이 정한다.
고정 우선순위는 늘 정해진 순서로 준다. 높은 놈이 계속 요청하면 낮은 놈은 한없이 밀린다(starvation).
라운드로빈(RR)은 한 바퀴 돌며 공평하게 준다. 아무도 안 굶지만 급한 master도 똑같이 기다린다.
버스트, 한 번 잡으면 몰아서
버스를 잡을 때마다 주소를 새로 부르면 손해다. 그래서 한 번 잡고 연속된 칸을 몰아서 가져온다. 그게 버스트(burst)다.
단발(single) 전송은 매번 주소를 보내고 데이터 한 칸을 받고 길을 놓는 과정을 반복한다.
주소를 부르는 준비 cycle이 매번 붙어 오버헤드가 크다.
버스트는 시작 주소 하나만 부르고 ‘여기서부터 4칸 연속’을 한 번에 받는다.
준비 cycle이 한 번으로 줄어 같은 데이터를 훨씬 적은 cycle에 옮기고, 그만큼 대역폭이 올라간다.
단, 버스트 동안은 그 master가 버스를 길게 쥔다. 다른 master의 대기가 그만큼 늘어난다. 길이는 공평성과 맞바꾸는 선택이다.
매 칸마다 주소를 새로 부른다. 준비 cycle 4번
주소 한 번으로 연속 4칸을 받는다. 준비 cycle 1번, 대역폭 ↑
DMA, CPU 대신 짐 옮기는 일꾼
큰 데이터를 메모리에서 주변장치로 옮길 때, CPU가 한 칸씩 손으로 나르면 그동안 아무 일도 못 한다. 그 운반을 떼어 맡긴 것이 DMA다.
DMA는 Direct Memory Access, 메모리에 직접 접근하는 전용 운반 엔진이다. 그 자체가 하나의 master다.
CPU는 처음에 한 번만 명령한다. 출발 주소·도착 주소·개수를 적어준다.
그 뒤로는 DMA가 알아서 버스를 요청해 칸을 옮긴다. CPU는 손을 뗀다.
그동안 CPU는 다른 계산을 한다. 옮기기가 끝나면 DMA가 인터럽트로 완료를 알린다.
운반을 떼어내 CPU를 멈추지 않게 두는 것이 DMA의 이점이다.
다만 DMA도 버스를 써야 하니 같은 arbiter 아래서 CPU·GPU와 다툰다.
한 칸씩 손으로 나른다. 계산은 0
DMA가 옮기는 동안 CPU는 계산한다. 끝나면 IRQ로 알린다
직접 돌린다, 버스와 DMA 스케줄러
CPU·GPU·DMA의 요청을 한 버스 타임라인에 올리고, arbiter 정책을 바꿔 누가 언제 통과하는지 본다.
STEP으로 cycle을 한 박자씩 진행하면, 그 cycle에 grant 받은 master는 진하게, 기다리는 요청은 흐리게 뜬다. 버스트를 켜면 한 grant가 여러 cycle을 연달아 쥔다.
아래 패널에 master별 평균 latency와 버스 점유율(대역폭 분배)이 쌓인다.
정책마다 빠른 master와 굶는 master가 갈린다. 정답은 없고 무엇을 우선할지의 선택이다.
Q. DMA를 두면 뭐가 좋은가?
정답은 CPU 대신 데이터를 옮겨줘서 그동안 CPU가 다른 일을 할 수 있다는 것이다.CPU는 출발·도착 주소와 개수만 한 번 적어주고 손을 뗀다. 실제 운반은 DMA가 버스를 잡아 처리하고, 끝나면 인터럽트로 알린다.
덕분에 큰 복사·전송 동안 CPU가 한 칸씩 나르며 멈춰 있지 않고 계산을 계속한다. 다만 DMA도 같은 버스를 쓰니 arbiter의 중재 대상이 된다.
STEP을 눌러 cycle을 하나씩 진행해 보자. grant 받은 master가 타임라인에 쌓인다.
평균 latency = 그 master의 요청들이 grant 받은 cycle의 평균(작을수록 빨리 처리됨). 같은 요청 묶음이라도 정책에 따라 누가 빠르고 누가 굶는지가 갈림, 정답은 없고 무엇을 우선할지의 선택임. 이 정책이 최종 MyChip의 버스 컨트롤러로 들어감.