돈을 많이 쓰면 캐시 메모리를 많이 얻을 수 있다. 그냥 같잖은 라임을 쓴게 짜증난다면 내 의도대로 된거니까 너무 놀라지 마라. 이런걸 어디다간 풀어놓는게 내 다음 생각을 하는데 있어 걸림돌이 되지 않는다.지역성간 지역성 : 방금 접근한 데이터는 곧 다시 접근될 가능성이 높다."방금 사용된 것 위주"로 데이터를 캐시에 두는 것, 즉 최근에 사용된 데이터를 유지하는 전략을 활용한다. 방금 쓴 변수는 곧바로 다시 쓸 확률이 높을 것이니까!!공간 지역성 : 방금 접근한 데이터의 근처에 있는 데이터가 곧 접근될 가능성이 높다.만약 프로그램이 배열[0]에 접근했다면, 공간 지역성에 따라 곧 배열[1], 배열[2]... 에 접근할 확률이 매우 높다. 캐시 메모리컴퓨터의 저장장치는 하나가 아니라, 속도, 용량, 가격..
앞의 글에서 다루었던 문제들은 명시적인 처리 내지 맥락에 맞는 작성으로 해결 할 수 있다. 컴파일러들이 이렇게 보수적으로 접근하는 것을 고려하면 TypeScript는 어쩌면 컴파일러 친절에 특화된 언어가 아닐까라는 생각이 든다. 한두줄 차이의 다른 최적화 기법을 논해보자.코드 이동 (Code Motion)가장 기본적이고 강력한 최적화 기법 중 하나이다. 루프 안에서 반복적으로 수행되지만 결과가 변하지 않는 계산을 찾아 루프 밖으로 빼내는 것이 주된 내용이다.for (int i = 0; i 예를 들어 아래와 같은 코드는 매번 같은 결과를 낼 x y를 반복문 밖으로 빼둠으로써 약간의 시간을 벌 수 있다.// 2차원 배열의 모든 요소에 (x * y)를 곱하는 함수void scale_matrix(int *mat..
여기서 논하는 내용들은 의외로 꼼수라고 느껴질정도로 별거 아닌 기법이지만 그런 플로우들이 많이 사용 될 때 아낄 수 있는 cost는 무시하지 못한다고 생각한다. 우리는 그런 최적화를 유발하는 일이 뭐가 있는지부터 알아본다.우리가 아무리 멋진 최적화 기법을 알고 있어도, 컴파일러가 왜 코드를 마음대로 최적화하지 못하는지 이해하는 것이 중요하다. 보통은 두 가지 원인이 있다.메모리 앨리어싱 (memory aliasing)함수 호출 (function calls) 메모리 앨리어싱 | Memory Aliasing메모리 앨리어싱은 서로 다른 이름(포인터)이 사실은 동일한 메모리 위치를 가리키는 상황을 말한다. 앨리어스(alias)가 '별명'이나 '가명'이라는 뜻인 걸 생각하면 이름에서 유추하기가 괜찮다.컴파일러는 ..
제목이 난해하게 느꼈다면 그럴 수 있다. 하지만 파이프라인을 생각하고 왔다면 당신도 난해한 것이다. 축하한다. 난해의 Depth가 있다는 것은 사람을 이해 할 수 있는 폭이 넓은 것이다. 아무래도 나는 타로 집을 차려서 여러분들이 고른 카드에 따라 프로젝트를 추천해줘야겠다.파이프라이닝 : CPU의 효율 극대화하기예시로 언급되는 SEQ 프로세서는 한 명령어의 1~6단계를 모두 끝내야만 다음 명령어를 진행한다. 이것은 비효율적이다.요즘은 파이프라이닝을 사용한다. 아래와 같은 예시를 보자.1번 사이클: 1번 명령어 인출(Fetch)2번 사이클: 2번 명령어 인출 & 1번 명령어 해독(Decode)3번 사이클: 3번 명령어 인출 & 2번 명령어 해독 & 1번 명령어 실행(Execute)이렇게 함으로써 이상적으로..
4장에 돌입함으로써, 현대 CPU의 핵심인 파이프라이닝이 왜 필요한지와 어떻게 성능을 극대화 하는지를 알아본다. 5장도 동시에 하고 있는데, 진짜 이렇게까지 해야 1KB씩 줄이는구나라는 마음에 보다 램 용량 걱정을 덜 하는 시대에 태어난 것은 다행이라고 생각한다.x86-64를 단순화 한 Y86-64 명령어 집합(ISA)를 살펴보자. 수십 년에 걸쳐 기능이 추가된 x86-64와 달리 교육용 모델 엔진을 사용하는 개념이다.데이터 이동 (Move):irmovq: immediate → register (상수 값을 레지스터로)rrmovq: register → register (레지스터 간 이동)mrmovq: memory → register (메모리에서 레지스터로)rmmovq: register → memory (레..