거두절미하고 귀찮으니까 빨리 쓴당
솔직히 글 읽었으면 이런 생각일 것.
"그래 뭐 알겠다. 지역성이 중요하고 템포랄, 스패셜,.... 니가 그렇다는데 그런 거겠지. "
"그런데 C 코드는 어떻게 짜야 하는데?"
캐시메모리는 모두 하드웨어에 의해 자동으로 처리되는 부분이고
프로그래머에게는 보이지 않는다.
그러나 캐시에 대한 지식이 있으면 캐시를 잘 울궈먹는 코드를 짤 수 있다!
C에서는...
1. 실행이 가장 빈번히 실행되는 코드의 부분(함수)을 찾는다
덜 실행되는 부분은 캐시에 올라가봤자 금방 빠져 나간다...
2. 그 함수에서 내부 루프에서의 캐시 미스를 줄인다
반복되는 레퍼런스는 temporal locality 측면에서 좋다
stride-1 reference pattern을 사용하면 spatial locality 측면에서 좋다.
*loop바디가 작으면 동일한 인스트럭션들에 여러번 접근할 수 있어 temporal locality 측면에서 좋다.
3. 왠만하면 지역변수를 쓰자. 성능 측면에서도 고려해 볼 측면이 있다.
C에서 지역변수는 보통 register(L0)에 값을 넣어 저장한다.
그러나 전역변수는 무조건 register에 주소(참조)를 넣어 접근한다.
* temporal locality를 이용하여 최적화하는 방식 중 가장 유명한 것이 blocking이다.
이 방식은 다음 코드를
요렇게 만든다.
for문이 잔뜩인데 오히려 빨라진다. 왜?? 딱 캐시에 들어갈 만큼 잘라서(blocking) 계산하는 거거든...
잘 모르겠으면 CSAPP책과 이전 글에 올린 ppt를 참고하세욧 ^_^
진짜 끗. ㅎㅎㅎㅎ 힘들었으
수고했어요
아 말 안 한게 stride-1 reference pattern은 캐시메모리들이 인식을 해서 알아서 더욱 최적화하는 경우가 있음. 걍 짱 좋으니까 많이 많이 쓰자...
감샤합미다
왠만->웬만 (왠지 빼고 웬임) [리듬 맞춤법 봇♬]
사람은 말이야 괜히 늙는게 아니여.. 이런지랄 하다가 늙는거여.. 앞으로는 이런고생 하지마센 ㅋㅋㅋㅋ ㅇㅂ
ㅋㅋㅋㅋㅋ 그래도 머리통 속에 정리 잘 됨 이걸로 이제 과제 해야됨 ㅋㅋㅋ
음... 추럴님... 공부는 열심히 하시는 듯한데 몇군데 아집이 보이고 자칫 잘못하면 잘못이해 할뻔한 부분이 보이는 군요. 그런부분을 방치하시면 위험합니다. 좀 더 유연한 사고를 하시기를...
네 도움이 필요합니다... 문제점을 지적해주세요
어디가 그렇죠?
저거 지칭하는 말이 있었는디... 블로킹이었나 - return 0;
음... 사고방식에 관한 문제라서... Csapp 에서 언급되는 최적화 팁들은 일반적인 상황에서는 유용할 지도 모르지만 하나의 성능좋은 씨퓨에 멋진 최적화를 해놓은 것보다 느려터진 100개의 씨퓨에 대충실행만 가능하게 만든(...) 프로그램이 빠른 케이스도 몇몇 케이스지만 존재합니다. 책에 쓰인 지식이 절대적인 지식이 아니고 그 책의 저자가 왜 이 지식을
블로킹이넹 - return 0;
추천하고 있는 가와 그가 제시한 근거들이 너무 저자에게 유리하진 않는가... 타 논문과 기술들을 대조해봤을때 저자는 이부분(대개 불리한부분)을 감추고 있는것 같다..라던가... 어쨋든 공부 힘내세요:) 저도 가르치는게 서툴러서 죄송합니다 ㅠㅠ
책 저자의 개드립을 발견하기 위해선 기반지식이 필요할때가 많으니... 결론은 학문적 시야로 끝나긴 하지만... ㅠㅠ
음 그 부분은 이해합니다... 올린 글에 틀린 지식이 없는 건 다행이네요. 그런데 저도 이거 배우면서... 과연 이런 걸 쓰게되는 날이 올까 하는 생각이 들기는 합니다. 근데 저자들의 생각도 그렇고 이렇게 특수한 머신에 깊게 파고드는 건 나중에 정말 필요할 때 하는 거고. 일단 이 책을 배운 애들 머리통에 캐시에 대한 거만 들어 있어도 성공인 거 같아요.
제가 보기엔 이 책은 일반사용자를 위한 책이고, 정작 미친듯한 최적화가 필요하고 당장 처리해야되서 머신 수천대 연결하거나 슈퍼컴사용을 진지하게 고려할 정도의(슈퍼컴 사용료는 1초단위로 요금이 매겨지고 요금은 얼마냐면.... 답이 없습니다) 상황에선 쓰기 미묘합니다. 그런 프로그램들은 프로그램 연산특성에 따라서 최적화를 하는게 기본이거든요
물론 기껏해야 데이터 백만~1억약간 정도밖에 처리안하는 프로그램을 미친듯한 최적화 어쩌고로 이해하시면 안됩니다
ㅁ//되서->돼서 (되어 = 돼임) [리듬 맞춤법 봇♬]
전역변수가 레지스터에 주소를 넣어 접근한다고 하셨는데, 이거랑 전역변수를 register로 선언하는거랑은 다른거지요? 제 기억으로는 전역변수는 register선언이 불가능한거로 알고 있어서요. 글이랑 관련이 없지만 궁금해서 여쭤봅니다 좋은 글 감사드려요
아 그건 C 키워드 같은데 그걸 꼭 선언 안 해줘도 필요한 변수에 대해서는 똑똑한 컴파일러느님이 알아서 해줘요. 게다가 이걸 붙여도 레지스터에 변수의 데이터를 넣는게 가능한 경우에만 해 주네요 표준에 보니까
http://en.cppreference.com/w/c/language/storage_duration
그리고 함수의 매개변수나 지역변수에 대해서만 가능하다고 하네요 The register specifier is only allowed for objects declared at block scope, including function parameter lists. It indicates automatic storage duration and no linkag
친절한 답변 감사드립니다
막짤은 그렇구나 하는데 뭔가 와닿지를 않는다..
항상 평가가 필요한 이유지
적용되지 않는 파라다임은 해당 시스템의 특수성을 반영하니까 컴파일 결과물은 컴파일러 버전별로 또 다르구 그게 항상 성능적 상향성을 보장하지는 않는다