오늘 끝나면
SIMD와 벡터 ALU
- ✓SIMD와 벡터 ALU의 핵심 문제를 한 문장으로 설명한다
- ✓오른쪽 실습에서 SIMD와이 어떻게 움직이는지 관찰한다
- ✓다음 강의와 이어지는 한계를 말할 수 있다
실습 미션
한 명령으로 여러 lane — mask·reduction·speedup 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.
성공 조건
- □실습의 기본값을 먼저 관찰
- □입력값이나 모드를 한 번 이상 바꿔 결과 비교
- □왜 결과가 바뀌었는지 한 문장으로 설명
반도체 설계 · 28
SIMD와
벡터 ALU
scalar는 데이터를 하나씩 처리한다.
SIMD는 한 명령으로 여러 칸을 동시에 처리한다.
데이터가 많을수록 더 빨라진다. GPU가 여기서 출발한다.
scalar, 한 명령에 한 칸
지금까지 만든 ALU는 한 번에 숫자 하나를 다룬다. 한 명령에 한 칸을 처리하는 방식이 scalar다.
데이터 16칸에 각각 10을 더하려면 같은 ‘더하기’ 명령을 16번 발행해야 한다.
칸을 읽고 더하고 쓴 다음 다음 칸으로 넘어간다. 칸 수만큼 명령 횟수가 그대로 늘어난다.
명령은 다 똑같은데 데이터만 바뀐다. 똑같은 일을 16번 반복하는 동안 명령을 꺼내 해석하는 비용도 16번 든다.
데이터가 100만 칸이면 scalar로는 100만 번이다.
명령은 다 똑같은데 칸만 바뀐다 · 16칸이면 16번
SIMD, 한 명령, 여러 lane 동시에
SIMD는 Single Instruction Multiple Data다. 명령은 하나, 데이터는 여러 개다.
ALU를 여러 벌 나란히 깐다. 이 한 벌 한 벌을 lane이라 부른다.
한 명령을 발행하면 모든 lane이 같은 연산을 자기 칸에 동시에 적용한다.
lane이 4개면 한 명령으로 4칸을 한꺼번에 더한다.
16칸을 4 lane으로 처리하면 명령은 16번이 아니라 4번이다.
명령을 꺼내 해석하는 비용도 4번으로 줄어든다. 같은 일을 4분의 1 횟수로 끝낸다.
이 lane 수가 곧 칩이 한 박자에 처리하는 데이터 폭이다.
명령 1번에 4칸을 동시 처리한다 · 16칸이면 4번이면 끝
mask와 reduction
모든 lane을 늘 다 쓰진 않는다. 일부만 켜거나 흩어진 결과를 하나로 모아야 할 때가 있다.
mask는 lane별 on/off 스위치다.
조건을 만족하는 칸만 켜고 나머지는 끈다. 꺼진 lane은 계산을 건너뛰어 원본을 그대로 둔다.
if 문 같은 분기를 lane 단위로 흉내 내는 방식이다.
reduction은 lane별 결과를 하나로 합치는 일이다. 다 더하거나 최댓값을 찾는 식이다.
16개를 한 줄로 더하면 15스텝이지만, 둘씩 짝지어 트리로 합치면 log₂16 = 4스텝이면 끝난다.
흩뿌려 계산하는 SIMD와 트리로 모으는 reduction, 이 두 박자가 벡터 연산의 기본 패턴이다.
꺼진 lane은 건너뛰어 원본을 유지한다 (lane 단위 if)
둘씩 짝지어 합친다 · 4개를 2단계면 하나로
직접 lane을 늘려 speedup을 본다
lane 수를 1, 2, 4, 8로 바꾸면 같은 16칸을 처리하는 명령 횟수가 어떻게 줄어드는지 보인다.
한 스텝에 lane 수만큼 칸이 동시에 처리된다. lane을 2배로 늘리면 데이터가 충분할 때 SIMD 사이클이 절반에 가까워진다.
mask로 lane을 끄면 그 lane은 사이클은 쓰지만 일은 안 한다. 가동률이 떨어진다.
reduction은 처리된 결과를 트리로 합쳐 하나의 합으로 모은다.
lane 1 = scalar(하나씩) · lane↑ = 한 번에 더 많이
켜진 lane 4 / 4, 꺼진 lane은 사이클은 쓰지만 일은 안 한다
speedup ×4, lane을 늘릴수록, 데이터가 많을수록 더 벌어진다.
16개를 한 줄로 더하면 15스텝. 둘씩 짝지어 트리로 합치면 4스텝이면 끝, 합도 SIMD로 빨라진다.
모든 lane이 꽉 찼다(100%). 한 명령이 4칸을 빠짐없이 처리해 SIMD가 가장 잘 먹히는 상태다.
SIMD가 빠른 이유는 한 명령으로 여러 데이터를 동시에 처리하기 때문이다. 데이터가 많고 lane이 다 차 있을수록 이득이 크다.
데이터가 많을수록 SIMD가 이긴다
SIMD가 빠른 이유는 단 하나다. 한 명령으로 여러 데이터를 동시에 처리하기 때문이다.
이득의 크기는 데이터 양과 lane 수에 달렸다.
데이터가 적으면 명령 몇 번 차이라 별 이득이 없다.
데이터가 많을수록 scalar는 그만큼 명령이 늘지만, SIMD는 lane으로 나눠 횟수를 깎으니 격차가 벌어진다.
단, lane이 다 차 있어야 이득이 온전하다. 마스크로 끄거나 데이터가 모자라 비면 그 lane은 놀게 된다.
그래서 SIMD 설계의 핵심은 lane을 늘리고 빈 lane 없이 꽉 채우는 것이다.
Q. SIMD가 scalar보다 빠른 이유는?
정답은 한 명령으로 여러 데이터를 동시에 처리하기 때문이다.scalar는 한 명령에 한 칸이라 데이터 수만큼 명령을 발행하지만, SIMD는 lane을 여러 벌 깔아 한 명령으로 여러 칸을 한꺼번에 처리한다.
그래서 데이터가 많고 lane이 다 차 있을수록 명령 횟수가 줄어 더 빨라진다.