뭘 더 공부해야하는가

학교에 있을 때라고 아예 못 느낀건 아니지만, 회사에 있으면서 더 절실하게 느끼는 것.

난 뭘 배우고 이 자리에 있으며, 뭘 더 배워야 잘 할 수 있을까

밑의 글 두 개 쓰면서 반쯤 녹초가 되었는데, 아무래도 "내가 정말 제대로 아나"를 의심하면서 글을 쓰려니 힘들었다. 회사에서 멀티스레딩으로 동작하는 서버 코드를 작성하면서 내가 알고있어야만 하는 지식들이 내가 배운 범위를 벗어나는 경우가 왕왕 생겨서 -_-;

예를 들어 멀티스레딩 코드를 짤 때마다 신경 써야하는 것 = 현대 CPU에 적용된 모든 최적화들.

현대 CPU는,

  • 메모리 연산을 다단계의 cache로 구성된 CPU 위에서 수행하고
  • 메모리에 저장하거나 읽는 순서는 바뀔 수 있고 (load-store-reordering)
  • 명령 실행 순서도 바뀔 수 있고 (out-of-order-execution)
  • 두 개의 branch를 동시에 실행하고(speculative execution) 그 결과를 취할 때도 있고
  • 대부분의 branch는 CPU의 branch-prediction-table을 들여다보고 맞게 가기도 하고 그렇지 않기도하고
  • 특정 값이 cache->메인 메모리에 전달되어야만 하는게 있고
  • 일부 연산은 메모리 버스랑 아주 안 친하게 돌 수 있고
  • CPU core 간 성능은 다를 수도(Cell), 같을 수도(intel/AMD) 있고
  • CPU core 간 통신은 bus나 메모리 컨트롤러를 쓸 수도 있고(Cell,AMD), cache를 쓸 수도 있고(Cell, intel)

같은 프로그래머에게 친절하지 않은 수준의 최적화가 이루어졌고, 내가 이걸 다 아느냐 하면 그건 아니니.[1]

  • 이런 식으로 코드를 짜면 코드가 너무 커지지 않나 — 학부생 때는 신경도 안 썼다. 내가 뭘 짜던 instruction cache를 다 채우긴 영 힘들다
  • 메모리 저장 순서가 제대로 될까 — 특정 메모리 읽기/쓰기에서 메모리 배리어를 제대로 쳤나 신경 써야한다
  • 명령 실행 순서 문제는 intel CPU를 믿기로하고(…)

같은 결정들을 내리는데, 내가 이걸 계속 끌어앉고 가느냐는 또 다른 문제 -_-;;

회사에 나오니 학교에서 부족했던게 너무 많이 보인다. 학교 다니는 것 처럼 압축해서 뭘 배울 기회는 점점 없어질텐데 걱정이 태산. 읽어야할 책도 태산. 생각해야할 문제도 태산.

시간은 제한되어있고, 알아야할 것은 많으니 시간 잘 쪼개고, 뭘 볼지 정하고, 뭘 생각할지 정하고 …

ps. 뭔가 밤늦게 반쯤 잠에 취한상태로 글을 쓰고 있고나.

  1. NUMA나 멀티 노드 시스템은 써보지도 않았고, 당분간은 써볼일도 없겠지만 현존하는 컴퓨터 구조만 해도 학부에서 배운 수준으론 택도 없을 정도로 어마어마하게 복잡하다. []

Author: rein

나는 ...

4 thoughts on “뭘 더 공부해야하는가”

  1. 이런저런 것들이 생각나지만 길어져서 패스 ㅡㅡ. 다만, 예전부터 늘 저울질 하던 문제인데… “소프트웨어 프로그래머”가 쓴 것과 같이 “찌질한 하드웨어 스펙(?)들을 일일히 다 고려해야만 하는” 현재 개발 환경들이 과연 좋은걸까? (게다가 캐쉬나 버스의 동작은 사람이 아니라 왠만한 시뮬레이터에서도 제대로 예측하기 힘든데 ;-;) 뭐 난이도는 그렇다 치고, ‘호환성’의 측면에서 말시.

  2. 호환성 측면을 둘째치고, memory r/w reordering을 하는 시스템에서,

    * 동기화 구문
    * 읽기/쓰기 구문

    의 순서로 뭔가를 하는데, 저런게 있다는걸 모르고 그냥 코드를 작성하면 제대로 안도는 코드가 나오지(…). 그래서 알고 짜야하는데 이게 정상이 아니다? 인것은 맞는듯한데 (아마 적당한 추상화가 안나온거겠지).

    문제는 지금 당장 면하고 있는 문제를 피할 수는 없다는거지

  3. 전 그냥 결과를 1분 더 기다리고-_-;
    안되면 1분 더 기다리고-_-;
    그래도 안되면 밥먹으러 가겠습니다.

    이런 해결방식이 안통하는 문제에 대해서는
    그방면 전문가에게 문의를-_-

  4. sylund / 결과를 기다리는 문제면 괜찮지. (예를 들어 논문 쓰려고 시뮬레이션을 한참 돌린다거나)

    그렇지만 응용 자체가 어떤 time-ciritical 한 면이 있고, 동시에 처리해야할 량이 일정 이상이어야하면 성능 문제는 닥쳐오게 되지.
    (다만 시스템을 잘 파악하고 최대한 미루는게(…) 내 방식이긴하지만)

Leave a Reply