성능 계산과 종합 추적
명령 수·CPI·클록과 Amdahl 법칙을 계산하고 실행·캐시·병렬 설계를 하나의 사례로 종합합니다.
“GHz가 높아졌으니 프로그램이 반드시 빨라졌다”는 결론은 성급합니다. 실행 시간은 필요한 명령 수·명령당 사이클·사이클 시간에 함께 영향을 받습니다. 단위와 가정을 쓰면 비교 근거가 분명해집니다.
CPU 실행 시간의 세 요소
단순 모델에서 CPU 시간 = 명령 수 × 평균 CPI × 클록 주기입니다. CPI는 Cycles Per Instruction, 명령당 평균 사이클 수입니다. 클록 주기는 주파수의 역수입니다. 2 GHz이면 0.5 ns입니다.
명령 100만 개, CPI=2, 주파수 2 GHz이면 200만 사이클/20억 사이클·초⁻¹=0.001초입니다. 새 컴파일러가 명령 수를 80만으로 줄였지만 CPI=3이면 240만 사이클로 더 느려집니다. 명령 수만 줄인 것이 시간 감소를 보장하지 않습니다.
명령 종류별 평균도 가중치가 필요합니다. 전체의 60%가 CPI=1, 30%가 CPI=2, 10%가 CPI=5이면 평균 CPI는 0.6×1+0.3×2+0.1×5=1.7입니다. 세 수의 단순 평균을 내지 않습니다.
일부 개선의 한계
Amdahl 법칙은 전체 시간 중 개선 가능한 비율 p를 s배 빠르게 만들 때 전체 속도 향상을 1 / ((1-p)+p/s)로 계산합니다. 원래 시간에서 어떤 비율인지 명시해야 합니다. 80%를 4배 빠르게 하면 1/(0.2+0.8/4)=2.5배입니다. 그 부분을 무한히 빠르게 해도 나머지 20% 때문에 최대 5배입니다.
병렬화에는 작업 분할·통신·동기화·불균형 비용도 있으므로 이 식의 s를 코어 수와 자동으로 같게 두지 않습니다. 모델의 예측과 실제 측정의 차이는 숨길 오류가 아니라 빠뜨린 비용을 찾는 단서입니다.
import math
def speedup(fraction, factor):
if not 0 <= fraction <= 1 or factor <= 0:
raise ValueError("비율은 0~1, 개선 배수는 양수")
return 1 / ((1 - fraction) + fraction / factor)
assert math.isclose(speedup(0.8, 4), 2.5)
assert speedup(0, 100) == 1
assert speedup(1, 4) == 4
assert math.isclose(0.6 * 1 + 0.3 * 2 + 0.1 * 5, 1.7)종합 문제: 센서 배열의 합
다음 조건을 독립적으로 가정합니다. 바이트 주소 방식을 사용하며, 4바이트 정수 배열의 원소 네 개가 주소 0·4·8·12에 있고 값은 2·3·5·7입니다. 캐시는 데이터 8바이트·블록 8바이트·직접 매핑·처음 비어 있음입니다. 레지스터 합계를 0으로 시작해 네 값을 순서대로 읽고 더합니다.
- 각 주소의 블록·오프셋과 적중열을 구하세요. 최종 합은 얼마인가요?
- 전체 실행 시간의 60%가 배열 처리이고 이 부분만 3배 빠르게 하면 전체 속도 향상은 얼마인가요?
- 두 코어가 앞 두 값·뒤 두 값을 따로 합산한 뒤 병합한다면 어떤 중간 결과를 저장해야 할까요? 공유 합계를 동기화 없이 수정하는 방법과 비교하세요.
힌트
한 블록은 정수 두 개를 담습니다. 2번은 바뀌기 전 시간 비율을 사용합니다. 3번은 부분 합과 최종 병합을 나누세요.
풀이
블록은 0·0·1·1, 오프셋은 0·4·0·4입니다. 한 라인뿐이라 블록 1이 0을 내보내지만 다시 0을 읽지 않으므로 적중열은 M·H·M·H입니다. 합은 17입니다.
전체 속도 향상은 1/(0.4+0.6/3)=1/0.6≈1.667배입니다. 각 코어의 부분 합은 5와 12이고, 둘이 완료된 뒤 17로 병합합니다. 공통 합계의 읽기·수정·쓰기를 동기화 없이 수행하면 갱신 손실이 가능하지만 부분 합 분리는 그 공유 갱신을 피합니다. 처리 속도는 통신·완료 확인 비용을 측정해야 판단할 수 있습니다.
다시 읽을 곳을 고르기
블록·오프셋을 틀렸다면 캐시 주소, 중간 레지스터가 불분명하면 CPU 데이터 경로, 병합의 이유를 설명하지 못하면 공유 메모리를 복습하세요. 이 세 기준을 모두 설명할 수 있으면 실제 ISA·캐시 성능 측정이나 운영체제 실습으로 확장할 기반을 갖춘 것입니다.