디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

[CS:APP 12] Cache Memories

츄럴(59.22) 2016.12.24 12:50:21
조회 1811 추천 6 댓글 15
														


어제 12화를 보고 머릿속으로 정리를 좀 하고나서 오늘 올립니다

CSAPP 수업을 듣거나 책을 읽지 않고, 이 과목을 들은 적 없는 사람들을 위해서

필요없는 부분은 최대한 쳐내고 가장 쓸모 있는 부분과 코딩 팁들을 정리해서 올립니다.



이전화 바로가기 

-------------------------------------------------------------

C/C++에서 아주 간단한 최적화...

https://gall.dcinside.com/board/view/?id=programming&no=668663&page=2&search_pos=&s_type=search_all&s_keyword=츄럴

[CS:APP 11] The Memory Hierarchy    

https://gall.dcinside.com/board/view/?id=programming&no=669079&page=1&search_pos=&s_type=search_all&s_keyword=츄럴

-------------------------------------------------------------





viewimage.php?id=3dafdf21f7d335ab67b1d1&no=29bcc427b28177a16fb3dab004c86b6f1241ce450ebd83e296e9e6afef9bca29cb44aa48201ee8ca9727b7729a1e742e0d9d66428e31d815473eeefce83b80f3

11화에서도 말했듯이, 프로그램이 나타내는 지역성에는 두가지가 있다.


하나는 temporal locality: 어떤 주소의 데이터를 반복해서 참조하는 것이다.

하나는 spatial locality: 어떤 주소 가까이의 데이터를 참조하는 것이다.



프로그램을 만들고 보니 이런 지역성이 나타나서, 하드웨어 설계자들은 이걸 이용해서 성능을 올리기 위해

cache라는 것을 만들어 낸다.



viewimage.php?id=3dafdf21f7d335ab67b1d1&no=29bcc427b28177a16fb3dab004c86b6f1241ce450ebd83e296e9e6afef9bca29cb44aa48201ee8ca9727b7729a1e742e0d9d66428a658e114234eca9e83b80f3

temporal locality를 잘 써먹으면 성능을 올릴 수 있다는 것은, cache라는 것이 존재한다는 것만 알아도 알 수 있다.

훨씬 빠른 저장장치에 이미 저장된 데이터를 여러번 울궈먹으면 당연히 성능이 올라갈 것이다.




viewimage.php?id=3dafdf21f7d335ab67b1d1&no=29bcc427b28177a16fb3dab004c86b6f1241ce450ebd83e296e9e6afef9bca29cb44aa48201ee8ca9727b7729a1e742e0d9d66428c648a421135eda9e83b80f3

참고로 cache memory는 아예 CPU안에 박혀 있다. 



그런데 프로그램에 spatial locality가 있으면 왜 성능이 향상될까?

잠시 한번 생각해 보자...










.

.

.

.

.

.

.

.

.

.

.

사실 이전 그림의 단순한 cache memory 구조로는 spatial locality에 의한 성능 향상의 원인을 알 수가 없다.

실제 캐시메모리가 작동하는 방식과 좀 더 자세한 내막을 알아야만 그 원인을 파악할 수 있다.



아마 하드웨어 제조자들이 프로그램에 spatial locality가 빈번하게 나타난다는 것을 알아채고

다음과 같은 구조와 기능을 갖도록 cache memory를 설계했을 것이다.


viewimage.php?id=3dafdf21f7d335ab67b1d1&no=29bcc427b28177a16fb3dab004c86b6f1241ce450ebd83e296e9e6afef9bca29cb44aa48201ee8ca9727b7729a1e742e0d9d66428b3581124a63bfa3e83b80f3


cache memory는 개념적으로는 bit들을 저장할 수 있는 2차원 배열이다.

이 2차원 배열에다가 하부 hierarchy에 있는 저장장치의 데이터들을 가져와서 임시로 저장한다. 

(즉 main memory의 데이터들을 가져와 저장한다)

그런데 데이터들을 마구잡이로 담을 수는 없으니까 데이터 저장의 규칙을 세우기 위해 이 비트들을 쪼갠다.


2차원 배열을 S개의 set(행)으로 나누고

나뉘어진 S개의 set을 또 E개의 line들로 나눈다. 그러면 이 캐시메모리에는 S*E개의 line이 있다.


각 line 하나는 3가지 영역으로 나누어진다.

1. valid bit   v: 이 비트는 현재 line에 있는 데이터가 하부 hierarchy에서 가져온 데이터들인지 판별해 준다. 1이면 valid하다는 것.

2. tag bits  tag: 이 비트들은 데이터를 캐시에 쓰고 읽는데 필요하다

3. cache block  : 이 바이트들이 바로 데이터가 저장되는 부분이다. 이 구조를 통해서 spatial locality를 이용한다.



여기서 cache block에 주목하라. 이 바이트열 때문에 spatial locality가 중요해진다. 

일단 이건 나중에 다시 설명하겠다.



그럼 이렇게 생긴 캐시 메모리에서 어떻게 데이터를 읽어올까?


CPU는 메모리에서 데이터를 읽고 싶으면 저장장치 쪽으로 메모리 주소를 발싸한다.

걔는 메모리가 어떻게 생겼는지는 별로 관심이 없다. 일단 데이터만 가져다주면 되는 것임.

일진이 빵셔틀에게 관심이 있겠는가?


여튼 CPU에서 어떤 메모리 주소(64bits)를 캐시쪽으로 발싸했다고 생각하자. 

그럼 여기서 다음을 알 수 있다


1. 이 메모리 주소의 데이터를 캐시가 가지고 있으면 cache hit!         빵셔틀cache은 주머니에 있던 빵data을 일진 CPU에게 바로 줄 수 있다

2. 이 메모리 주소의 데이터를 캐시가 가지고 있지 않으면 cache miss!    빵셔틀cache은 매점main memory에 달려가서 빵data을 사와야 한다! ㅠㅠ


주소를 표현한 비트들을 3가지 부분으로 나눈다.


viewimage.php?id=3dafdf21f7d335ab67b1d1&no=29bcc427b28177a16fb3dab004c86b6f1241ce450ebd83e296e9e6afef9bca29cb44aa48201ea696c44bbf729d187148be272c20fdf4bdac4eb3fad4



세 부분의 bits 중 t,s를 이용하여 캐시에 이 주소의 데이터가 저장되어 있는지 판단하고

마지막 b bits를 이용하여 캐시의 line의 블럭 어디서 부터 데이터를 읽을지 정한다.




viewimage.php?id=3dafdf21f7d335ab67b1d1&no=29bcc427b28177a16fb3dab004c86b6f1241ce450ebd83e296e9e6afef9bca29cb44aa48201ee8ca9727b7729a1e742e0d9d66428f648b4d1065ecfee83b80f3

1) 먼저 s bit들로 이 주소가 캐시의 어느 set에 있는지 판단한다.


viewimage.php?id=3dafdf21f7d335ab67b1d1&no=29bcc427b28177a16fb3dab004c86b6f1241ce450ebd83e296e9e6afef9bca29cb44aa48201ee8ca9727b7729a1e742e0d9d66428f63db454030e4fce83b80f3

2-1) 주소의 t bits와 1)에서 정한 set 안의 line들의 tag들과 비교한다. 이 비교는 t bits == tag가 나올 때까지 한다.

2-2) t bits == tag인 line을 1)에서 찾은 set 안에서 찾아냈으며 그 line의 valid하다면(valid bit v == 1) cache hit이다!


끝까지 비교해 보았으나 주소의 t bits == tag 인 line이 set에 존재하지 않았다면 cache miss이다!

데이터가 캐시에 없다할지라도 요청한 CPU에게는 데이터를 줘야하니까... 캐시는 하부 메모리에서 값을 가져와야 한다.


이 경우 set안의 line 중 하나를 골라서 데이터를 비우고 하부 메모리에서 값을 가져와 덮어 쓴다.

이 때 어느 line을 고르느냐는 하드웨어 만든 놈 맘대로(replacement policy)인데, 보통 가장 덜 참조되는 line을 고른다(Least Recently Used, LRU)



viewimage.php?id=3dafdf21f7d335ab67b1d1&no=29bcc427b28177a16fb3dab004c86b6f1241ce450ebd83e296e9e6afef9bca29cb44aa48201ee8ca9727b7729a1e742e0d9d6642813381151734bda9e83b80f3


3)마지막으로 주소의 b bits를 이용하여 cache block에서 어느 바이트부터 읽을지 정한다.



이렇게 하여 캐시를 읽을 수 있다.


그리고 이제는 알 수 있다. 


캐시는 어떻게 해서 프로그램의 spatial locality를 통해 성능을 향상시키는가?

stride-1 reference pattern이 stride-2 reference pattern보다 이론적으로는 약 2배 빠른가?


그것은 cache block의 존재, 그리고 cache를 읽는 방식 때문이다!



예를 들어 stride-1 과 stride-2를 비교해 보자.

10개짜리 char배열에 접근하여 데이터를 캐시에서 CPU로 가져올 때,

캐시 블럭의 크기가 5 byte라고 하자. 그러면 다음과 같은 그림을 그릴 수 있다.


viewimage.php?id=3dafdf21f7d335ab67b1d1&no=29bcc427b28177a16fb3dab004c86b6f1241ce450ebd83e296e9e6afef9bca29cb44aa48201ee8ca9727b7729a1e742e0d9d66428d318e43443fefaee83b80f3


viewimage.php?id=3dafdf21f7d335ab67b1d1&no=29bcc427b28177a16fb3dab004c86b6f1241ce450ebd83e296e9e6afef9bca29cb44aa48201ee8ca9727b7729a1e742e0d9d6642dd6288404b33efa8e83b80f3


그래서 stride-1이 이론적으로는 2배쯤 성능이 높은 것이다.


이렇게 하드웨어 제조사는 cache block이라는 구조를 만들어서, 프로그램의 spatial locality를 활용하여 성능을 올렸다.



...솔직히 이 부분의 제 설명이 잘 이해가 될지 모르겠습니다.

CMU에서 제공하는 ppt를 같이 올릴테니 거기서 슬라이드쇼 한번 보시면 이해가 빠르실 거 같습니다. 


글 하나로 이번 강의 내용을 다 정리하려 했는데 어렵겠네요

이제 제일 중요한 코딩 팁 같은 걸 적어야 하는데 디시가 그림 10장 제한 때문에...

마지막으로 지금껏 설명한 캐시 메모리가 인텔 최신 i7 CPU에서 어떻게 박혀 있는지 보여드리고

다음 글에서 캐시가 중요한 이유랑 코딩 팁, 최적화 방식을 올리겠습니다.



viewimage.php?id=3dafdf21f7d335ab67b1d1&no=29bcc427b28177a16fb3dab004c86b6f1241ce450ebd83e296e9e6afef9bca29cb44aa48201ee8ca9727b7729a1e742e0d9d66428f3189414b64bdace83b80f3


실제로는 이렇게생긴 애들이 계층구조를 이룹니다...

L0에 데이터가 없으면 L1에서 가져오고, 거기에도 없으면 L2에도 가져오고, 거기에도 없으면  L3, 거기에도 없으면

최악으로 메인메모리까지 내려가서 가져옵니다. 이거 완전 다단계


일단 끗


추천 비추천

6

고정닉 3

1

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 며느리, 사위되면 시댁, 처가에 잘할 것 같은 스타 운영자 25/10/13 - -
공지 프로그래밍 갤러리 이용 안내 [96] 운영자 20.09.28 47990 65
2896814 AI 바이브 코딩 인생 40 년 갈아 넣었습니다. 프갤러(59.16) 20:12 0 0
2896813 이런 글 너무 좋은데 어떠니 ㅇㅇ갤로그로 이동합니다. 20:09 4 0
2896812 영포티가 뭐임 배구공(119.202) 19:58 9 0
2896811 하.. 쒸불;; 딱 대 ♥덩냥이♥갤로그로 이동합니다. 19:29 17 0
2896810 일이 씨발 요실금걸린 노인네 오줌줄기마냥 [1] ㅆㅇㅆ(124.216) 19:27 18 0
2896809 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥덩냥이♥갤로그로 이동합니다. 19:17 12 0
2896807 나님 기분 ㄱㅆㅅㅌㅊ !!! ♥덩냥이♥갤로그로 이동합니다. 19:10 12 0
2896806 나님 배뷰르니 슬슬 시작해볼까낭? ♥덩냥이♥갤로그로 이동합니다. 19:06 13 0
2896805 AI에게 욕 잘하는법 [1] 프갤러(183.109) 18:58 15 0
2896804 네스트 모듈 순환참조 열받네 [2] 프갤러(27.166) 18:57 21 0
2896802 생각해보니 좀 열받네? 그냥 일주면되지 [7] ㅆㅇㅆ(124.216) 18:30 58 0
2896801 뉴비 c++을 잘하고싶어요 [2] ㅇㅇ(118.235) 18:26 47 0
2896800 근데 프로그래밍 아는게 없어가지고 [2] ㅆㅇㅆ(124.216) 18:08 38 0
2896799 슬슬 ㄹㅇ 진짜 마라톤 계절이 오는듯 주말에 장거리 함 조져야징 ♥냥덩이♥갤로그로 이동합니다. 17:50 22 0
2896797 뉴비 객체지향 제대로 이해한게 맞을까요? [7] ㅇㅇ(118.235) 17:32 92 0
2896795 현시대는 토발즈도 1찍 짱깨편인 무서운 시대이다ㅋㅋ번식 더 해줘라 이기 타이밍뒷.통수한방(1.213) 17:30 15 0
2896794 월세 폭등 리짜이밍 ㅋㅅㅋ ♥냥덩이♥갤로그로 이동합니다. 17:28 20 0
2896793 김대중자서전 드립 치니까 생각난건데 대구 살때 서문시장서 [2] ㅆㅇㅆ(124.216) 17:21 45 0
2896792 학생노무 새키가 롬복을 쓴다고? [3] 루도그담당(211.184) 17:20 47 0
2896791 최근에 프로그래밍 책들 읽을만한게 없네 [3] ㅆㅇㅆ(124.216) 17:14 38 0
2896790 인지과학조져라 손발이시립디다갤로그로 이동합니다. 16:47 22 0
2896789 친중극좌 이재명 또 거짓말 [5] ♥냥덩이♥갤로그로 이동합니다. 16:43 41 0
2896788 ai들 왜케 핵심 이라는 단어 좋아하냐 ㅋㅋㅋ [6] 따당갤로그로 이동합니다. 16:39 47 0
2896787 잊지 않겠습니다.. [2] ♥냥덩이♥갤로그로 이동합니다. 16:31 37 0
2896786 속보] 짱깨들 한국에서 건보 6조원 먹튀 충격 [1] ♥냥덩이♥갤로그로 이동합니다. 16:20 24 0
2896784 아름답구낭 ♥냥덩이♥갤로그로 이동합니다. 16:14 23 0
2896783 애새끼까는 중국인들한테 혜택 더 주는 나라 ㅋㅋㅋㅋ 타이밍뒷.통수한방(1.213) 15:59 18 0
2896782 코딩 기초 언어 추천해주세요 [9] 프갤러(118.222) 15:37 85 0
2896780 학원 비추 [2] 루도그담당(58.239) 15:35 46 0
2896779 안년하세요, 프로그래밍을 처음 시작하려는 사람입니다! [8] 사피엔스갤로그로 이동합니다. 15:13 72 0
2896778 내가 느끼는 AI가 잘하고 못하는거 [1] ㅆㅇㅆ(124.216) 15:07 36 0
2896777 AI 써보면 내가 느낀게 최대 클래스 하나까지 작성해야함 [1] ㅆㅇㅆ(124.216) 14:54 37 0
2896776 여러분은 새 API 써야할 때 어떻게 하나요?? [3] 프갤러(120.142) 14:53 45 0
2896775 어느순간 AI랑 싸우고 있음 [6] ㅇㅇ갤로그로 이동합니다. 14:50 74 0
2896774 하도 긴장하니까 평온액 먹고 갔는디 [1] 무관갤로그로 이동합니다. 14:49 31 0
2896773 [애니뉴스] 소설 사이트 개발 프갤러(121.172) 14:45 18 0
2896772 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ [1] ♥냥덩이♥갤로그로 이동합니다. 14:24 36 0
2896771 코딩 ai ChatGPT 는 코드 복사해서 붙여넣기 ㅇㅇ(218.234) 14:13 27 0
2896770 [간절한요청] IT기업 직원 관련 설문 프갤러(39.7) 13:53 28 0
2896769 나 고민중 도움바람 [4] 프갤러(211.234) 13:34 61 0
2896768 일본 it 가면 망함? [3] 프갤러(106.102) 13:30 54 0
2896767 gpt 섹톡기능 오픈한댑니다. [2] 프갤러(218.154) 13:29 50 0
2896766 코딩에 ai 쓰지 말아야 하는 이유 [2] 프갤러(218.154) 13:25 52 0
2896763 나는 뉴비일수록 ai 알려줘야겠던데 [4] ㅆㅇㅆ(124.216) 13:07 66 0
2896762 뉴비들은 기초가 없는데 AI를 쓰는건 좀 비추 [2] 루도그담당(58.239) 13:01 54 0
2896761 근데 AI가 코딩 짜면 더 잘짜지 않냐. [2] ㅆㅇㅆ(124.216) 12:57 67 0
2896760 캄보디아말고 핑보디아는 없냐 [4] 루도그담당(58.239) 12:55 50 0
2896759 나중에 1000억정도 생기고 캄보디아같은 사건 생기면 내가 처리해줄생각임 ㅇㅇ(223.39) 12:50 21 0
2896758 근데 교수가 빡칠만 하네 [5] 루도그담당(58.239) 12:50 69 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2