본문 바로가기

ComputerScience/Multi-core Computing

멀티코어컴퓨팅 - 1. Introduction to Multicore Computing

728x90

목적

thread programming으로 프로그램의 성능을 높이는 방법을 배운다.

 

multicore processor?

코어가 여러개인 processor

core하나가 cpu에 대응된다. 명령어를 읽고 실행하는 computing unit이다. 

core(CPU) : "independent" processing unit that reads/executes program instructions and consist of register, ALU, CU, cache

core는 "독립적으로" arithmetic, logical operation, memory read/write등의 명령어를 수행할 수 있다.

일반적으로 프로세서를 cpu라고 부르지만 엄밀히 processor는 여러개의 코어로 구성된 하나의 chip이고 코어는 각각 하나의 cpu에 대응된다.

즉 멀티코어 프로세서는 여려개의 독립적인 명령들을 concurrently, 동시에 처리할 수 있다.

멀티 코어를 활용할 수 있도록 알고리즘을 설계하면 소프트웨어의 성능을 크게 향상시킬 수 있다. (software 알고리즘에 강하게 의존)

 

processor 살펴보기

참고로 위,우측 그림에서 core가 L1, L2 캐쉬는 각각 가지고 있는데 L3 캐쉬는 공유하는 모습이다.

이렇게 모든 코어가 동일하면 symmetric 프로세서라고 하고 코어들의 성능이 다르다면 asymmetric 프로세서라고 한다.

인텔 i9-12900k의 경우 16코어 중 8개는 고성능(P), 8개는 저전력(E) 코어를 섞어서 사용한다. (asymmetric 프로세서)

 

GPU(graphic processor unit) 

cpu와 gpu의 아키텍쳐는 완전히 다르다.

gpu는 (cpu보다 제한적인 명령에 한해서) 특히 병렬처리에 특화되어 있고 코어수도 cpu보다 훨씬 많다. (천개단위)

그래픽 작업에서는 scene을 짧은시간 반복해서 그림으로써 더 부드러운 모델의 움직임을 구현하거나 수백만개의 triangle mesh를 그려서 사실적 묘사를 한다. 혹은 수백만개의 픽셀로 구성된 고해상도 이미지의 밝기를 전체적으로 늘리는 경우 각 픽셀마다 동일한 작업을 병렬로 처리해 더 빠르게 작업을 수행할 수 있다. 행렬 연산의 경우도 그렇다. 수천개의 코어가 한번에 독립적으로 연산을 수행하는 것이다.

 

NVIDIA에서는 자사 GPU를 활용할수 있는 병렬 컴퓨팅 플랫폼으로 CUDA를 제공한다.

GPU는 보통 그래픽처리를 위해 사용되고 만들어졌지만 이 GPU를 좀더 일반적인 general purpose(ex. 수학계산 등)에 사용해보자는 목적으로 생긴게 GPGPU이다. 이때 CUDA를 사용한다.

OpenCL도 parallel programming platform중 하나이다. 하지만 CUDA가 더 유명하다.

 

parallel application

이미지, 영상 처리

3D graphics

game

simulation

maching learning

비트코인 채굴

이런 분야는 gpu의 병렬처리가 없다면 불가능했을지도 모를 분야들이다.

 

Thread/Process

process : 메모리 할당 단위, 프로세스끼리는 독립된 메모리 공간을 할당 받는다.

thread : cpu할당 단위, 한 프로세스의 여러 쓰레드들은 프로세스의 메모리 공간을 함께 공유한다. (share/cooperate)

multithreaded program이란 한 프로그램에서 여러 쓰레드가 동시에 수행되는 것을 말한다.

 

*잠깐 32bit/64bitCPU에 대해서 알고가자.

cpu는 연산을 수행할때 연산 대상이나 중간 결과 값들이 저장되어있는 메모리 주소 혹은 연산 중간 결과 값을 레지스터에 저장한다. 

대부분의 현대 프로세서는 메인 메모리에서 레지스터로 데이터를 옮겨와 데이터를 처리한 후 그 내용을 다시 레지스터에서 메인 메모리로 저장하는 방식을 사용한다.

32, 64비트는 레지스터의 크기를 나타낸다. 즉 32bitCPU의 경우 레지스터의 크기가 2^32(약 4GB)bit 라는 것이다. 이 말은 즉 32비트 프로세서가 표현할수 있는 주소공간 개수, 더 쉽게 표현하자면 메모리의 서랍장 수가 4GB개라는 것이다. 이 프로세서는 메모리를 8GB 혹은 그 이상을 꽂아줘도 4GB이상의 공간을 사용을 할수 없다. 레지스터가 2^32개까지만 비트를 표현할 수 있기 때문이다.

 

parallel computing

multiple core processor를 사용해서 single core processor보다 더 빠르게 문제를 해결하는 것이다.

하나의 컴퓨터를 구성하는 여러 프로세서들은 하나의 메모리를 공유한다. multi-thread programming과 강한 연관성을 갖는다.

 

distruibuted computing

여러 컴퓨터들이 아주빠른 네트워크를 통해 통신하는 구조이다. 각 컴퓨터는 private memory를 갖는다.

각 컴퓨터가 sub-task를 수행하고 모인 sub-tasks들이 최종 result로 merge된다.

분산처리의 주 목적은 신뢰성(reliable)이다. 한 노드가 고장나거나 실패해도 나머지 노드들에 의해 서비스가 안정적으로 사용자들에게 제공될 수 있다.

 

distruibuted computing - cluster computing

여러개의 컴퓨터들을 high speed network를 통해 서로 연결한 집합이다. 성능에 비해 가격이 저렴하다.

distributed computing 구조기 때문에 각자 메모리를 가지고 공유하는 하나의 메모리가 없다. 유지보수의 어려움이 있다.

보통 컴퓨터들은 한 공간에 모여있다.

 

distruibuted computing - Grid computing

여러개의 컴퓨터들이 네트워크를 통해 loosely coupled(메모리를 공유하지 않음)되어 있다.

컴퓨터의 종류가 다 다를 수 있다.(heterogeneous) 또한 서로 간 거리도 매우 멀 수 있다.

병렬처리처럼 문제를 빠르게 풀기위해 고안된 아주 큰 규모의 시스템이다. 

네트워크를 통해 내 pc의 cpu,gpu연산력을 제공할 수도 있다.

 

cloud computing

internet을 기반으로 서비스(서버, 스토리지, 머신러닝 api, hardware resources 등..)를 제공하는 것을 말한다.

aws, azure를 통해 손쉽게 global scale의 it resources를 사용할 수 있고 사용자는 사용량에 따라서 돈을 지불하면 된다.

 

Good Parallel Program

당연히 결과가 정확하고 성능이 좋아야 한다.

scalability(컴퓨팅 자원이 추가되었을때 그 비율만큼 computational power도 증가해야한다)해야 한다.

load balance(task들이 모든 Processor들에게 골고루 분배되어야 한다.)

 

The Concurrency Revolution

하드웨어가 시간이 지나면서 발전하면(clock스피드 향상, execution optimization 싸이클당 처리 명령어수 증가, cache크기 증가) 소프트웨어의 성능도 자연스럽게 올라간다. 이것을 the free performance lunch라고 한다.

하지만 영원히 cpu성능 향상이 지속될줄 알았지만 2005년부터 그 발전의 한계가 보이기 시작했다.

그 한계를 극복하고자 multicore 설계를 선택하게 되었다. clock speed는 더 이상 올라가지 않고 core가 많이 들어가게 된 것이다.

소프트웨어 개발자 입장에서도 performance lunch가 더 이상 공짜가 아니게 되었다. 

그래서 새로운 SW혁명으로 Concurrency가 등장하게 되었다.

sw들이 멀티 코어를 활용해 성능을 높일 수 있도록 concurrency문제를 다루게 되었다.

 

무어의 법칙

회로의 집적도가 2년마다 두배가 된다는 법칙이다. (관찰한 현상, 법칙은 아니다.)

그에 따라 memory capacity, processing speed, sensor의 성능도 지수배로 성장했다.

cpu내의 트랜지스터 수는 계속해서 증가하고 있다. 그에따라 지속적 성능향상이 이루어졌다.

하지만 2005년부터 이내 곧 한계를 맞닥뜨리게 되는데 집적도가 2배가 되어도 clock speed가 더 이상 늘지 않는 것이다.

집적도가 커지고 clock speed가 빨라질수록 전력소비, 발열이 높아져서 clock speed 향상이 더뎌졌다.

 

그래서 요즘 저전력 프로세서가 대세인 것이다. power소비량을 줄여서 heat generation을 줄이는게 핵심이 되었다.

 

branch prediction, pipelining, out of order execution 테크닉들이 등장해서 cpu의 성능을 도왔다.

clock speeds는 그대로지만 그 clock speed안에서 처리할 수 있는 명령어의 수를 늘리는 방식으로 발전이 이루어졌다.(ILP)

하지만 더 이상의 trick들이 없어보였다.

 

그래서 코어를 여러개 붙이는 트렌드가 부상했다.

 

Intel Core Duo vs AMD Dual Core

memory coherent, 메모리 일관성은 두 개 이상의 프로세서 또는 코어가 공통 메모리 영역을 공유하는 컴퓨터 시스템 설계에 영향을 주는 문제를 말한다. 

인텔 코어들은 L2 cache를 공유한다. 

AMD 듀얼코어 칩의 경우는 코어마다 분리된 cache를 갖는다.

 

generic SMP

symmetric multiprocessor system.

이런 아키텍쳐는 보통 라우터등의 고가에 장비를 위해 사용된다.

하나의 메모리를 여러 동일한 코어들이 공유한다.

 

GPGPU : NVIDIA GPU

수천개의 코어가 들어가 있다. 

general한 목적이라기 보다는 고도로 병렬화된 작업을 위해 사용된다.

matrix계산, graphic 작업에 특히 높은 성능을 보인다.

문제를 해결하기 위해 cpu gpu 모두를 활용하는 hybrid programming model도 있다.

 

principle of parallel computing

Finding enough parallelism (Amdahl’s Law) : 암달 법칙에 따라 적절한 수의 thread 선택

s는 sequentially한 부분의 비율이다. 따라서 1-s는 병렬처리가 가능한 작업의 비율이다.

parallel에 의해 속도향상이 일어나더라도 1-s 파트에서만 해당한다. (Potential program speedup is defined by the fraction of code that can be parallelized) 따라서 speedup은 1/s보다 클 수 없다.

 

granularity : work unit의 크기

 

Locality : 지역성, 인접성, 한 작업에 필요한 데이터는 인접한 곳에 모여있을 가능성이 크다는 뜻이다. 예를들면 배열에 있는 원소의 합을 구한다고 해보자. 높은 확률로 메모리에 배열값들은 연달아 저장되어 인접한 곳에 모여있다.

프로세서가 메모리로부터 데이터를 가져오는 비용은 만만치 않다. 지역성을 활용해서 프로세서가 데이터를 더 쉽고 빠르게 가져올 수 있도록 인접하게 데이터를 관리하는 작업도 중요하다.

 

Load balance : 부하가 여러 core에게 잘 분배 되었는지

Coordination and synchronization : 서로다른 코어들의 결과가 동기화가 잘 되었는지

 

overhead of parallelism : additional cost이다. 프로세스나 스레드를 시작하는데 걸리는 시간, shared data끼리 communication, 동기화 비용 등 병렬처리를 위해 발생하는 추가 비용을 말한다.

 

이런 것들이 parallel programming의 어려운 이유이다.

728x90
반응형