고성능 파이썬(2)
- 책읽기
- 2019. 4. 16.
코드 예제, 데이터셋
https://github.com/scari/high_performance_python
Build software better, together
GitHub is where people build software. More than 31 million people use GitHub to discover, fork, and contribute to over 100 million projects.
github.com
1장. 고성능을 위한 파이썬 이해하기
하이퍼스레딩: 운영체제가 가상의 두 번째 CPU를 인식하게 한 다음, 똑똑한 하드웨어 로직이 단일 CPU의 실행 유닛에 두 스레드를 섞어 실행하도록 하는 기법이다. 잘만 작동하면 단일 스레드 대비 30%까지 성능을 끌어올릴 수 있다. 이 기법은 두 스레드가 서로 다른 실행 유닛을 사용할 때, 예를 들어 한 스레드가 실수 연산을 하고 다른 스레드가 정수 연산을 한다면 잘 작동한다.
암달의 법칙(Amdahl's law): 멀티코어에서 작동하도록 설계된 프로그램일지라도 하나의 코어에서 실행되어야 하는 루틴이 존재하고, 이 루틴이 더 많은 코어를 투입했을 때 기대할 수 있는 최대 성능 향상치의 병목으로 작용한다는 법칙이다.
=> 단순히 CPU에 더 많은 코어를 넣는다고 프로그램의 실행 시간이 항상 단축되는 것은 아님을 뜻함.
파이썬에서는 전역 인터프리터 락(Global Interpreter Lock, GIL) 때문에 여러 개의 코어를 활용하기가 쉽지 않다. GIL은 현재 사용 중인 코어가 몇 개든, 한 번에 하나의 명령만 실행되도록 강제한다.
=> multiprocessing 모듈을 이용하거나 numexpr, Cython 같은 기술을 이용하거나, 아니면 분산 컴퓨팅 모델을 사용하는 방법으로 회피할 수 있다.
1.1.2. 기억장치
대부분의 기억 장치는 데이터를 조금씩 자주 읽을 때보다는 한꺼번에 많이 읽을 때 훨씬 빠르게 작동한다. 전자를 임의접근(random access, 후자를 순차 접근(sequential access)이라 한다.
읽기/쓰기 속도와 더불어 기억 장치는 지연시간을 가진다. 기억 장치에서 지연시간이란 장치에서 데이터를 찾기까지 걸리는 시간을 의미한다.
프로그램의 메모리 사용 패턴을 최적화하려면 단순히 어떤 데이터를 어디에 저장할 것인지, 또 어떻게 저장할 것인지(순차적인 읽기 속도를 높이려면), 그리고 몇 번이나 데이터를 옮길 것인지를 최적화 하면 된다. 여기에 추가로 비동기 I/O와 선점형 캐시를 사용하면 시간을 낭비하지 않고 데이터가 필요할 때 바로 읽을 수 있도록 할 수 있다. 이 모든 과정은 다른 계산을 수행 중일 때도 독립적으로 일어난다!
1.1.3. 통신계층
다양한 통신 수단이 있지만 모두 버스(bus)라고 하는 것의 변형이다.
예를 들어 FSB는 RAM과 L1/L2 캐시를 연결한다. FSB는 처리할 준비가 된 데이터를 옮겨서 프로세서가 계산할 수 있도록 하며, 계산이 완료되면 다시 돌려준다. 외부 버스 같은 다르 버스도 존재하는데, CPU와 시스템 메모리가 외부 하드웨어(하드디스크나 네트워크 카드 같은)와 통신하기 위한 것이다. 외부 버스는 일반적으로 FSB보다 느리다.
GPU를 사용하는 데 가장 큰 걸림돌은 바로 연결되어 있는 버스다. GPU는 주변장치이므로 일반적으로 FSB보다 훨씬 느린 PCI 버스로 연결되어 있다.
버스의 데이터 전송 속도는 한 번에 전송할 수 있는 데이터의 양을 나타내는 버스 폭(width)과 초당 몇 번을 전송할 수 있는지를 나타내는 버스 주파수(frequency)에 의해 결정된다.
* 무거운 데이터(heavy data)라는 개념은 데이터를 옮기는 데 시간과 노력이 필요하다는 사실을 의미하며, 이는 피해야 한다.
'책읽기' 카테고리의 다른 글
고성능 파이썬(6) (0) | 2019.04.18 |
---|---|
고성능 파이썬(5) (0) | 2019.04.18 |
고성능 파이썬(4) (0) | 2019.04.16 |
고성능 파이썬(3) (0) | 2019.04.16 |
고성능파이썬(1) (0) | 2019.04.16 |