멀티코어와 병렬

June·2022년 3월 5일
2

우테코

목록 보기
19/84

학습 배경

모던 자바 인 액션 첫 장을 읽어보면 마치 스트림을 써야하는 이유가 멀티코어 컴퓨터의 보급화와 병렬성을 이용하기 위함인 것처럼 전개하고 있다. 하지만 stream에서 디폴트는 parallel이 아니고, 이펙티브 자바에서도 스트림 병렬화는 주의해서 사용해라(아이템 48)고 했다. 따라서 병렬화 때문에 스트림을 쓴다는 것은 개인적인 생각으로는 조금 비약이 있지 않나 싶지만, 병렬화에 대해 그토록 강조를 해서 조금 더 깊게 알아보기로 했다.

병렬

여러 개의 연산을 처리해야하는데, 그 연산들이 서로 의존성이 없으면 나머지 연산을 기다리지 않고 동시에 수행하는 것이 병렬 컴퓨팅의 기본 개념이다. 여기서 동시에 수행할 수 있는 대상을 찾는 것이 시작점이고, 이 일련의 과정을 병렬화라고 한다.

싱글코어에서는 하드웨어 수준의 비트나 명령어를 병럴치러함으로써 성능을 향상시켜왔고, 멀티코어 시대에서는 다수의 코어를 이용하는 스레드 수준의 병렬처리 기법으로 발전했다.

하드웨어 수준의 병렬처리을 요약하면 싱글코어에서 클럭속도를 높이고 명령어 수준 병렬성을 하지만, 하드웨어의 제약으로 발열, 전력 소모 같은 문제점들이 있다.

멀티코어

병렬컴퓨터는 결합 구조에 따라 분류할 수 있는데, 다수의 프로세서가 주기억 장치 및 I/O를 공유하며, 하나의 운영체제가 모든 프로세서를 관리하는 구조(Symmetric Multi-Processor)의 한 예가 멀티 코어다.

멀티 코어의 각 코어들은 메모리 접근 성능을 높이기 위해 명령어 캐시와 데이터 캐시, 2차 레벨의L2 캐시를 가지고 있으며, 모든 코어는 L3 캐시를 통하여 데이터를 공유하게 된다.

싱글코어에서는 프로세서가 한 개밖에 없기 때문에 운영체제 수준에서 멀티태스킹 기법을 제공한다. CPU를 짧게 번갈아 가며 점유하는 것이다.

멀티 코어는 여러 개의 작업을 각 코어에 나누어 분배하여 병렬 처리가 가능하다.

멀티코어 환경에서는 컴퓨터가 알아서 병렬처리를 해 주는 것이 아니라, 프로그램을 구현할 때 동시에 수행될 수 있는 대상을 찾아 쓰레드를 만드는 작업, 쓰레드 간의 자원경쟁을 해소하기 위한 동기화 작업 등을 반드시 수행해줘야 한다.

“공짜 점심의 시대는 끝났다.”
허브셔터라는 사람이 남긴 말이다. 과거 싱글코어가 주류였던 시절에는 하드웨어가 발전하면 개발자의 아무런 노력 없이 소프트웨어의 수행 성능이 자연히 따라 향상이 되었지만 멀티코어 시대로 넘어오면서 더 이상은 소프트웨어가 하드웨어에 의존하여 성능 향상을 기대하기 힘들어지게 되었다. 멀티코어가 성능 향상을 제대로 발휘하기 위해서는 소프트웨어적으로 코어들을 활용한 병렬처리가 필요하기 때문이다.

병렬화

병렬화는 위의 과정을 거쳐서 진행된다. 하지만 병렬화 대상을 찾기 위해서, 또는 파이프라인을 적당한 크기로 나누기 위해서 비용이 많이 든다.

적절하게 사용되면 코어 수만큼 성능 향상이 일어날 수 있지만, 하단의 글을 참고하여 가능하면 성능 최적화는 신중하게 하자.

아이템48. 스트림 병렬화는 주의해서 적용하라

0개의 댓글