안녕하세요~


이번글에서는 NVIDIA에서 출시했던 GPU 아키텍처들에 대해 알아볼거에요. 

가장 먼저 출시됐던 Tesla 아키텍처를 살펴보면서 기본적인 NVIDIA GPU 구조에 대해서 알아보고, 해당 GPU의 스펙을 이해하기 위한 몇몇 개념들도 알아보도록 하겠습니다!




<1.NVIDIA GPU 아키텍처 발전 순서>


NVIDIA가 발표한 GPU 아키텍처의 이름을 보면 아래와 같아요.

해당 아키텍처를 기반으로 여러 NVIDIA GPU 모델들을 만들고 있는데요.


<사진1>


지금부터 위의 모델들을 간단히 살펴보도록 할게요!

(좀 더 자세한 아키텍처 설명을 보고싶다면 -> 링크)




<2.Tesla>


2008년 NVIDIA에서 출시한 GPU 아키텍처에요.

Tesla GPU는 SM(Streaming Multiprocessor)의 집합으로 이루어져있습니다. Tesla에서 SM은 8개의 SP(Stream Processor)와 2개의 SFU(Special Function Unit), shared memory 등으로 이루어져있있어요.

SP (Core)를 보통 CUDA core라고 하는데, GPU의 각 세대마다 SM, SP의 개수가 차이가 납니다.


<사진2>



1)SP(Stream Processor)

SP는 core 역할을 하기 때문에 CPU의 core격인 ALU와 같이 논리,수학 연산(with MAD(Multiply-add-Divide))을 수행합니다.


2)SFU(Special Function Unit)

SFU는 초월함수, 픽셀 attribute interpolation 등의 연산에 사용되고 4개의 부동 소수점 곱셈기도 포함하고 있습니다.


2-1)초월함수

초월함수는 일반적으로 다항식의 근으로 정의할 수 없는 함수를 의미한다고 합니다 (정확한 의미는 모르셔도 될 것 같아요~)


<사진3>


그냥 보시기에 함수가 조금 특이하다고 보시면 될 것 같아요 (보통 함수라하면 고차함수 꼴이니까요 ㅎ).

과학계산을 하다보면 아래와 같은 초훨함수들을 빈번하게 계산하게 되는데 이런 부분들을 SFU가 담당해주는것 같아요.


<사진4.초월함수의 예>



2-2) 부동소수점 연산


부동소수점에 대해서 알아보기 전에 고정 소수점 방식을 알아보도록 할게요.

앞서 CPU편을 보시면 알겠지만 명령어를 처리하는 단위에 따라 32비트, 64비트로 나눌 수 있다고 했어요.


만약 32bit 명령어 체계를 사용한다면 아래와 같이 부호(+,-)와 정수부, 소수부로 나눌 수 있을거에요.

그런데 아래와 같은 문제점은 정수, 소수부를 표현할 수 있는 경우가 제한적이에요. 예를들어 정밀한 과학계산에서는 더 세밀한 단위를 표현하기 위해 굉장히 많은 소수부를 사용해야 할 텐데 이것이 16bit로 표현이 안된다면 문제가 생기겠죠? 

<사진5>




그래서 나타난 개념이 부동 소수점 방식이에요. 


<사진6>


유효숫자를 나타내는 가수와 소수점의 위치를 풀이하는 지수로 나누어 표현하는 방식이에요.


<사진7>


부동소수점에서는 지수부(Exponent)는 기준값(Bias)를 중심으로 +,- 값을 표현합니다 (이렇게 쓰도록 정의한것!).

일반적으로 기준값은 2^0을 의미하는데 float의 경우는 기준값이 127이 됩니다.

예를들어, float에서 2^1은 기준값(127)+1 = 128 이기 때문에 이진수로 표현하면(지수부:8bit) 

가 됩니다.






가수부는 1.xxx 형태로 정규화를 한뒤 가장 왼쪽에 있는 1을 제거하고 소수점 이하의 자리 값만 표현하게 됩니다. 아래 예를들어 볼게요.


13.5를 32bit 부동소수점 (float:32bit)으로 표현해본다고 할게요.





 

2-3)FLOPS(FLoat point Operations Per Second)


FLOPS는 컴퓨터의 성능을 표현하는데 굉장히 중요한 지표로 사용되요.

말그대로 초당 부동소수점을 계산하는 능력을 의미하는데요. 딥러닝을 사용해보신 분들은 아시겠지만 대부분 계산들이 부동소수점(실수형태: float 자료형)으로 계산이 되는걸 볼 수 있을거에요.


그렇기 때문에 FLOPS라는 지표가 딥러닝과 같이 소수점을 기반으로 한 과학연산에서 시간을 측정하는 중요한 지표가 될 수 있겠죠? 만약 FLOPS 성능이 좋은 GPU를 사용한다고 하면 다른 FLOPS가 낮은 GPU보다 모델을 학습시키거나 inference하는 것이 더 빠를거에요.



아래 사진에서는 딥러닝을 돌리기 위해 자신들이 최소한 어떠한 성능의 GPU를 사용해야하는지 간접적으로 알려주고 있어요. 예를들어 VGG19를 돌리기 위해선 적어도 40G-Ops 이상을 지원하는 GPU를 구매해야겠죠? (1080 Ti 급의 GPU가 보통 11.3 TFLOPS를 지원한다고 하네요.)


1,000,000,000 FLOPS = 1 GFLOPS(giga FLOPS)

1000 GFLOPS = 1 TFLOPS (Tera FLOPS)




<사진8>


 



3)SM(Streaming Multi-processor)

만약 8개의 SP와 2개의 SFU가 모두 사용될 경우 SM에서는 1 clock cycle 당 최대 16(=8+4X2)회의 부동소수점 곱셈을 수행할 수 있어요.



4)Shared memory

Shared memory는 SM내에서 실행되는 thread 사이의 data 교환을 가능하게 해주는곳이에요 (CPU편에서 thread와 process의 차이를 보셨죠?ㅎㅎ 안보셨다면 --> 링크)

Tesla에서 Shared memory는 16KB 용량을 갖습니다.




5)SIMT(Single  Instruction Multiple Threading)

(GP)GPU로 넘어오면서 CUDA를 지원하자 SIMT 방식을 고안합니다.


CPU에서는 주로 SIMD(Single Instrcution Multiple Data)라는 용어를 사용하는데요. CPU의 성능을 최대한 활용하기 위해서 하나의 명령어로 여러개의 데이터를 처리하도록 하는 동작을 의미합니다. 


CUDA가 등장하면서 하나의 명령어로 여러개의 Thread를 동작시키는 일이 필요해졌기 때문에 SIMT 방식을 고안하기 시작한거죠. 




<사진9>







<3.Fermi>


Fermi는 2010년에 출시된 NVIDIA GPU 아키텍처에요.


Tesla에서 각 SM마다 제공되던 16KB shared memory는 64KB로 용량이 늘었어요.

SM외부의 texture unit의 도움을 받아 실행되던 load/store 명령도 SM내에 Load/store (LD&ST) 유닛이 추가됨으로서 SM 자체적으로 실행이 가능해졌습니다.



<사진10>


SM에 포함되어 있는 SP는 Tesla에 비해 4배가 늘어난 32개로 구성되었어요 (이때부터 SP를 (CUDA) core라고 명명하게 됩니다). 하나의 SM에 포함된 32개의 CUDA core는 16개씩 2그룹으로 나뉠 수 있고, 각 그룹마다(16개의 core마다) 16개의 LD&ST unit이 1그룹, 4개의 SFU가 1그룹을 이룬답니다.


Tesla에서는 각 SP내부에 존재하던 register file이 Fermi에서는 하나의 큰 Register File로 통합이 됐어요. 이럴경우 register를 많이 쓰는 thread와 적게 쓰는 thread가 섞여 있을 때 Tesla의 경우보다 Fermi 구조의 Register File 형태가 더 효율적이라고 합니다.


Core가 늘어난 만큼 늘어난 core를 최대한 실행시키기 위한 명령어를 공급해주어야 하는데요. 이를 위해 Warp Scheduler의 개수를 2개로 늘렸어요. Warp scheduler는 서로 의존성이 없어 독립적으로 Dispatch unit을 통해 명령어를 보낼 수 있다고 합니다.


Tesla의 SP는 32-bit 부동소수점을 지원했는데요. Fermi에서는 32-bit 부동소수점을 지원하는 CUDA core 2개를 동시에 사용할 수 있어 64bit 부동소수점 연산을 할 수 있게 됩니다. 또한 Tesla에서는 MAD(Multiply-ADD)를 지원했는데 MAD 작동방식이 그래픽 분야에서는 문제가 없지만 General Purpose 같이 세밀한 연산을 할 경우에는 문제가 되기 때문에 FMA(Fused Multiply-ADD를 지원하면서 GPGPU 컴퓨팅에 대한 지원을 강화했어요.





<3.Kepler(2012)>



Fermi 구조에서는 CUDA core, LD&ST unit, SFU 등의 실행 유닛들이 다른 유닛들에 비해 두 배 빠른 속도로 동작했다면 Kepler 구조에서는 전체 유닛이 동일한 속도로 동작하도록 변경시켰어요 (Performance/Watt 문제로 이런식의 구조를 고안했다고 합니다).


<사진11>





Kepler부터 SM이라는 용어가 SMX로 이름이 바뀌었어요. 전체 속도와 동기화시키위해 CUDA core의 속도를 줄였기 때문에 이전 속도를 유지하기 위해 더 많은 CUDA core, LD&ST, SFU 등을 장착했어요. Kepler의 SMX는 192개의 CUDA core, 64개의 DP(64-bit Double Precision) 유닛, 32개의 LD&ST 유닛, 32개의 SFU로 구성됐습니다.


Kepler에서는 HPC(HIgh Performance Computing)을 고려해 64bit 부동소수점 연산을 위한 전용 DP 유닛이 제공되었기 때문에 32bit, 64bit 부동소수점 연산이 동시에 실행될 수 있다고 합니다.


<사진12>


늘어난 core의 수를 잘 다루기 위해 warp scheduler의 수도 4개로 늘어났고, Dispatch unit도 하나의 warp scheduler 당 1개에서 2개로 늘어났어요. 그래서 SMX는 동시에 최대 8개의 명령을 처리하는것이 가능해 졌답니다. 또한 Register file의 크기도 128KB로 4배가 늘어났고, L1 cache 크기도 128KB로 늘어났습니다.


하나의 thread가 사용할 수 있는 register 수가 Fermi의 63개에서 255개로 늘어났는데 이러한 점은 Dispatch Unit의 증가와 더불어 그래픽 연산보다는 HPC 응용분야의 성능 (ex:과학연산)향상을 고려한 변화라고 볼 수 있습니다. 







<4.MaxWell(2014)>


Kepler에서 Maxwell로 아키텍처가 변하는 과정에서 미세공정이 28nm에 머물러 있었기 때문에 획기적인 변화를 꾀하지 못할거라 생각한 NVIDIA는 모바일 버전의 GPU 구조를 출시하고자 하면서 이전 kepler 구조를 최적화하려고 했어요.


<사진13>




<5.Pascal(2016)>


2012년 AlexNet 등장으로 주목을 받기 시작한 딥러닝은 2014년 GoogLeNet, VGG의 등장으로 딥러닝 붐을 일으키기 시작했습니다 (관련논문 정리->링크).

2016년 GTC에서는 딥러닝과 AI에 대한 내용을 상당부분 다루면서 NVIDIA가 나아갈 방향에 대해서 설명하기도 했으며, 동시에 Pascal이라는 인공지능에 특화된 GPU 아키텍처를 소개하게 됩니다.


Pascal 부터는 HPC(High Performance Computing)분야 (GP104 GPU)와 그래픽 분야(GP100 GPU) 두 가지 버전으로 나눠서 제품을 출시하게 됩니다.


<사진14>



HPC 또는 딥러닝 분야에서는 64bit, 16bit 부동소수점연산(FP64/FP16)을 지원하면서 하나의 thread가 많은 register를 사용하도록 했고, 그래픽 분야에서는 32bit(FP32)를 주로 사용하고 프로그램이 간단해 register 개수를 굳이 늘리지 않도록 했습니다.


<사진15>



딥러닝 기반의 pascal 구조의 가장 큰 특징은 16bit 부동소수점(FP16) 연산을 지원한다는 점입니다. 실제 딥러닝을 하다보면 weight, bias, learning rate 등의 값 등을 이용할 텐데, 다른 과학분야보다는 초정밀한 값을 요구하는건 아니기 때문에 32bit 처리 방식보다는 16bit 처리 방식으로 변경하도록 했습니다. 16bit 부동소수점 처리방식으로 바꾸면 32bit 처리 방식에서 사용했던 것 보다 메모리 용량과 대역폭에 대한 부담이 줄어들게 됩니다.


또한 GP100 Pascal의 CUDA core는 FP16 연산을 처리할 때 한 싸이클에 두 명령어를 처리할 수 있기 때문에 FP16연산 성능은 FP32 연산 성능의 두배가 된다고해요. 

간혹가다 다른 두 GPU를 사용할때,  A라는 GPU보다 메모리가 더 작은 B라는 GPU에서는 딥러닝이 잘동작하는데, A GPU에서는 작동이 안된다고 하면 FP부분이 차이가 있는지 확인하셔야해요! 



<6.Votal(2018)>

Volta 아키텍처를 채택한 GV100은 TSMC의 12nm 공정으로 구현되었습니다.

기존에 사용된 CUDA core는 FP32 코어로 이름이 바뀌었습니다. 이전에 GPU가 "64FP -> 16FP"로 변환된 걸 봤듯이, Votal에서는 8bit 단위의 INT(정수연산) 코어가 추가되었습니다. 이렇게 하여 inferencing을 가속화시켰다고해요.

<사진16.GP(Pascal) VS GV(Volta)>


Volta에서 눈여겨 볼 부분은 INT32 연산과 tensor core를 제공하여 실제 학습 또는 inference 속도를 대폭 향상시켰다는 점이에요.

Deep learning에서는 대부분 계산이 "D=A*B+C" 단위로 이루어집니다 (A:입력값, B:가중치(weight), C:bias, D:출력 값). 빠른계산처리를 위해 A,B 부분은 FP16 단위(floating point 16bit, half precision)로 계산이되고, 더 정밀한 accuracy를 위해 C,D는 FP32(floating point 32bit, single-precision)으로 처리하는 mixed precision 연산을 수행하는 tensor core를 고안해냈어요.


<사진17>

V100 GPU에는 SM당 8개의 Tensor core가 장착되어 있으므로, 하나의 SM에서는 64x8x2=1024 번의 "곱셈+덧셈" floating point 연산이 한 사이클에 수행됩니다. V100에는 80개의 SM이 장착되어 있으므로 80*1024번의 연산이 한 사이클에 수행되는셈이죠.

<사진18>


이전 파스칼 아키텍처기반의 P100보다 mixed-precision 개념을 도입한 volta 아키텍처 기반의 V100 모델의 9~10배의 성능을 내게 됩니다.

<사진19>

<사진20.ResNet 학습 및 추론 성능차이>


cuDNN은 출시되는 최신 GPU 모델에 맞게 업데이트가 되는 경우가 있는데, 최신 GPU인 volta와 당시 최신 소프트웨어 플랫폼인 cuDNN이 결합되면 훨씬 더 좋은 성능을 낸답니다.

<사진21>





<7.Turing>

2018.02에 발표된 Volta는 PC급에 제공되기 힘든 가격을 갖고 있었으나, NVIDIA는그해(2018) 8월에 Turing이라는 새로운 아키텍처를 발표합니다. 당시에 출시한 제품들은 굉장한 고가였으나 한달뒤에 나온 Turing 기반 RTX Geforece 20시리즈가 출시되었어요 (현재 인공지능을 연구하는 개인이나 PC급으로 연구하는 연구실같은 경우는 RTX 20 시리즈를 사용하고 있답니다)


<사진22>



<사진23>


<사진24>


이전 글에서 설명드린 NVLINK도 지원하고 있는걸보니 multi-GPU를 쓰면 더 효과가 배가 될 것 같아요.

<사진25>


Volta의 큰 골격은 유지하면서 규모를 절감한 마이너 파생상품으로 간주되고 있는데요. 눈에 띄는 부분은 RT core를 지원하는것과 4bit 정수(INT) 연산도 가능하게 했습니다.


<사진26>


<사진27>



RT core는 Ray Tracing을 위한 기술이에요. HPC(High Performance Computing)을 위해 점점 발전해 나가고 있지만 그래픽 부분도 포기 할 수 없기 때문에 RT(Ray Tracing) 기술을 접목시켰다고해요.


1)Ray Tracing(RT; 광원추적)

RT란 그래픽으로 구성된 3D 공간에서 어떤 물체에 빛이 반사되거나, 어떤 물체에 의해 그림자가 생기거나, 빛의 굴절을 일으키는 모든 작용들을 고려하여 화면에 표현해주는 기술이에요. RT core를 통해 실시간(real-time)으로 이러한 기능들을 가능하게 해준것이 가장 큰 특징이라 할 수 있어요.






<8.Ampere>


2020.03월 Votal 아키텍처의 후속작으로 Ampere라는 NVIDIA GPU 아키텍처가 소개됐어요. 결론부터 말씀드리면 Ampere 아키텍처는 작정하고 딥러닝을 위해 만든 GPU라고 보시면 될 것 같아요.



<사진28>



먼저 Ampere 아키텍처는 TSMC의 7nm 미세공정으로 인해 Volta보다 훨씬 뛰어난 성능을 갖추게 되었어요.



1) 기본적인 Spec 차이 


우선 VRAM과 Memory Bandwidth, Memory Bus Width, Memory Clock이 ..... ㅎㄷㄷ


<A100: Ampere, V100:Volta, P100:Pascal>



딥러닝 연산도 몇배는 빨라지겠네요..




Ampere에서 주목할 부분은 딥러닝에 최적화된 새로운 정밀도인 TensorFloat-32(TF32) 가 도입됐다는거에요. Tensorflow 자료형을 보면 tf.float32을 볼 수 있는데, tensor 자료구조에서 float을 제공해주는것을 하드웨어적으로 support해줄 수 있는것 같아요. 그래서 정밀하게 계산을 할 수 있으면서도 속도는 빠르게 유지해주는듯 합니다.




TF32는 FP32와 같이 작동하면서 코드 변경없이 딥러닝 모델을 최대 20배까지 가속한다고 해요. (참고로 TF32 형태가 FP32보다 6배는 빠르다고 하네요)

또한 Mixed Precision이라는 연산기법을 지원하는 시도도 있는데, single-precision인 FP32와 half-single-precision인 FP16을 적절히 잘 섞어주면서 속도(speed)와 정확도(accuracy)를 모두 잡았다고 합니다. 


단적인 예로, FP16을 이용하기 때문에 딥러닝 모델에 대한 메모리 요구량도 줄어들어 더 큰 모델을 GPU에 로드할 수 있게 되었고, 더 큰 mini-batches (size)도 가능하게 해주었어요.


(홈페이지를 자세히 보니 Turing, Volta 아키텍처에서도 mixed precision 기법이 제공되나봐요. 그런데, Ampere에서는 FP32가 사용될 때, TF32와 같이 사용되는 반면에, Volta, Turing에서는 FP32만 사용되니 mixed precision 효과가 덜 한거 같아요)


<사진29>



위와 같은 Mixed Precision은 코드 몇줄만 추가해주면 사용가능하다고 하니 참고하세요!










2) Sparse connection


Sparse connection은 쉽게 말해 딥러닝에서 쓰이는 parameter 중에 불필요한 부분을 0으로 만들어 계산을 좀 더 빠르게 하거나, 차원수를 줄여주어 overfiting을 피해주는 기법으로 사용되곤 하는데요.


Ampere 아키텍처에서는 이러한 sparse model에 support해주는 기법을 제공해주나 봅니다. A100(Ampere)의 tensor 코어는 sparse model에 대해 최대 2배 높은 성능을 제공해주는데, inference 시간도 줄여줄 뿐만 아니라 학습성능도 개선하는데 사용할 수 있다고 합니다.


<사진30>







<사진31>




4)PCI 4.0 and NVLINK 3.0


Ampere 아키텍처는 특히 Multi-GPU를 사용할 경우 그 성능이 대폭 향상됩니다.



PCI 4.0으로 인해 CPU와 GPU, 그리고 GPU 간의 데이터 전송속도 및 양이 증가했는데요. 여기서 추가로 NVLink 3세대를 도입하면서 GPU간의 직접적인 대역폭을 2배인 600GB/s로 증가시켰어요. 이는 PCI 4.0의 10배에 달하는 속도입니다. 




5) Multi-Instance with Kubernetes


Ampere 아키텍처는 최대 7개의 sub-group gpu로 partitioning 할 수 있어요.


<사진32>



예를들어, 40GB VARM을 갖고 있는 ampere GPU는 각각 20GB VRAM을 갖는 2개의 sub-ampere GPU로 나눌 수 있어요. 최대 5GB의 sub-ampere gpu 7개를 생성할 수 있고, 이렇게 나눈 GPU들을 나중에 다시 merge(통합) 할 수 있어요.


사용사례를 보면, 낮에는 낮은 처리량 추론을 위해 7개의 sub-GPU를 사용하고, 밤에 퇴근할 때는 딥러닝 모델 학습을 위해 1개의 본래의 GPU 인스턴스로 만들어주어 사용해요.


<사진33>


각각의 sub-group을 형성하는 gpu들은 서로 독립적이기 때문에 서로다른 프로그램을 실행시켜도 CUDA가 각각 인스턴스에 맞추어 실행됩니다. 



<사진34>


이러한 MIG(Multi-Instance GPU) 기술은 컨테이너 또는 쿠버네티스와 같이 DevOps 유저들에게 특히 유용하다고 하는데, 조만간 Kubernetes를 공부할 예정이라 공부를 하고 나면 좀 더 명확하게 설명해보도록 할게요! ㅎㅎ





지금까지 NVIDIA에서 출시하는 GPU 아키텍처에 대해 간단히 알아보았어요.

다음글에서는 실제로 우리가 구매하는 NVIDIA 외장그래픽 카드(GPU) 모델들을 알아보도록 하겠습니다! ㅎㅎ




[글 래퍼런스]

http://donghyun53.net/nvidia-gpu-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EB%B3%80%EC%B2%9C%EC%82%AC-%EC%83%81%ED%8E%B8/

http://hwengineer.blogspot.com/2018/03/v100-tensor-core.html

https://greatzzo.tistory.com/m/56

http://haanjack.github.io/cuda/2016/03/27/cuda-prog-model.html

https://www.hardwaretimes.com/simd-vs-simt-vs-smt-whats-the-difference-between-parallel-processing-models/

https://www.nvidia.com/ko-kr/technologies/multi-instance-gpu/

https://www.nvidia.com/ko-kr/data-center/nvidia-ampere-gpu-architecture/


[사진 래퍼런스]

사진1

https://www.notebookcheck.net/Nvidia-will-end-critical-updates-for-Kepler-laptops-on-April-2020.413755.0.html

사진2,13,14,15

http://donghyun53.net/nvidia-gpu-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EB%B3%80%EC%B2%9C%EC%82%AC-%EC%83%81%ED%8E%B8/

사진3

https://m.blog.naver.com/PostView.nhn?blogId=alwaysneoi&logNo=100133312954&proxyReferer=https:%2F%2Fwww.google.com%2F

사진4

https://ko.wikipedia.org/wiki/%EC%B4%88%EC%9B%94%ED%95%A8%EC%88%98

사진5,6

http://tcpschool.com/cpp/cpp_datatype_floatingPointNumber

사진7

https://wttjj.tistory.com/293

사진8

https://towardsdatascience.com/neural-network-architectures-156e5bad51ba

사진9

https://m.blog.naver.com/PostView.nhn?blogId=shakey7&logNo=221312640455&proxyReferer=https:%2F%2Fwww.google.com%2F

사진10

https://www.semanticscholar.org/paper/NVIDIA-%E2%80%99-s-Fermi-%3A-The-First-Complete-GPU-Computing-Glaskowsky/620f84d78b228d4a3b03b7aee40c4d9e46287d36

사진11

https://www.geeks3d.com/20120517/nvidia-kepler-gk110-architecture-whitepaper-2880-cuda-cores-and-compute-capability-3-5/

사진12

https://www.researchgate.net/figure/NVIDIA-Kepler-architecture-7_fig2_270876234

사진16

https://www.slideshare.net/insideHPC/inside-the-volta-gpu-architecture-and-cuda-9

사진17,19

http://hwengineer.blogspot.com/2018/03/v100-tensor-core.html

사진18

https://www.nvidia.com/ko-kr/data-center/tensor-cores/

사진20

https://www.bodnara.co.kr/bbs/article.html?num=140148

사진21

https://news.developer.nvidia.com/cudnn-7-5-now-available/

사진22

https://www.reddit.com/r/nvidia/comments/973dqp/pascal_vs_turing/

사진23

http://drmola.com/reviews/298395

사진24

https://quasarzone.com/bbs/qc_qsz/views/180581

사진25

https://www.anandtech.com/show/13282/nvidia-turing-architecture-deep-dive/4

사진26

https://www.udna.kr/tesla

사진27

https://analyticsindiamag.com/tesla-t4-nvidia-gpu/

사진28

https://www.wepc.com/news/nvidia-ampere-gpu/

사진29

https://developer.nvidia.com/automatic-mixed-precision

사진30

https://www.nvidia.com/ko-kr/data-center/nvidia-ampere-gpu-architecture/

사진31

https://www.servethehome.com/nvidia-tesla-a100-ampere-resets-the-entire-ai-industry/

사진32

https://namu.wiki/w/NVIDIA/GPU?from=GeForce#s-3.15

사진33

https://www.nvidia.com/ko-kr/technologies/multi-instance-gpu/


안녕하세요~


이번글은 GPGPU라는 개념과 CUDA를 소개하면 GPU구조를 가볍게 살펴볼거에요.




<1.GPGPU>


CPU는 다양한 시스템 자원(ex; I/O device)를 제어해야하고 복잡한 명령들을 처리해야하기 때문에 연산을 위한 장치 이외에도 다른 구성요소들이 존재해요. 


하지만 GPU는 본래 그래픽처리를 위해 고안된 장치였기 때문에 단순한 연산들을 병렬로 고속처리가 가능했었죠. (CPU처럼 제어기능이 필요없기 때문에 복잡한 구조를 버리고 연산(ALU)에 특화시킨 장치로 활용되기 시작한거죠. 그렇기 때문에 GPU는 단독으로 시스템자원을 활용할 수 없어 CPU의 제어를 받아야해요.)


예를들어, 다차원 행렬과 같이 병렬적으로 연산처리가 가능한 과학계산에서도 유용하게 쓰일 수 있다는 사실을 발견했던거죠.


이렇게 단순히 그래픽처리만 하는 GPU와 달리 병렬로 연산기능까지 수행하게 되면서 GPU를 GPGPU(General Purpose GPU)라고 부르기 시작했답니다. "그래픽처리+과학연산" 개념을 묶어서 GPGPU라고 부르긴 하지만 다시 GPU라고 부르고 있어요.


<사진1.GPU 초록색 부분이 ALU를 의미하며 일반적으로 core라고 부른다>







<2.CUDA(Compute Unified Device Architecture)>


(GP)GPU의 등장으로 병렬계산을 뒷받침해줄 소프트웨어가 필요했어요.

과거 GPU를 그래픽용도로만 사용했을때는 OpenCL, DirectX라는 병렬 소프트웨어가 있었는데 이를 구사하기 위해서는 독특한 언어(HLSL, GLSL 등)을 배워야했으며 그래픽스 목적으로 만들었기 때문에 이래저래 공부할것도 많았죠.


(GP)GPU 개념이 등장하면서는 C/C++ 언어로 병렬계산에 필요한 기능들을 제공해주는 소프트웨어가 만들어졌어요. 대표적인 소프트웨어가 NVIDIA의 CUDA입니다. 그래서 딥러닝을 하시거나 머신러닝을 하시는 분들은 먼저 tensorflow, pytorch 등의 프레임워크를 설치하실 때 CUDA 먼저 설치해야 했던거에요!



CUDA가 진행되는 방식을 설명드려볼게요.


1)병렬처리할 데이터들을 main memory에서 GPU memory로 이동시킨다.

2)CPU는 GPU에게 GPU memory에 있는 데이터를 연산하라고 명령한다.

3)GPU는 CPU가 명령한 연산처리를 병렬로 수행한다.

4)GPU가 작업을 다 마치면 다시 GPU memory에 결과물을 저장하고, 다시 main memory로 해당 결과물을 업로드한다. 그리고 CPU가 main memory에 접근해 해당 결과물을 이용하여 작업을 마무리한다.


<사진2>




CUDA는 기본적으로 CPU와 GPU 코드를 조합해서 코딩합니다. CUDA는 NVCC(NVidia CUDA Compiler)라는 NVIDIA 독점 컴파일러를 통해 CPU에서 수행되는 코드(.c(C)/.Cpp(C++))와 GPU에서 수행되는 코드(.cu)가 분리되어 컴파일이 됩니다. 



<사진3>


그리고 Linker에 의해 하나의 실행파일(binary file)이되어 CPU에서는 Serial Code로, GPU에서는 Parallel code로 순차실행이 됩니다. (이런 과정 때문에 앞서 언급한 CPU, GPU간의 병목현상이 일어납니다.)



<사진4>



<사진5>






<3.cuDNN>


하드웨어 가속이란 컴퓨팅 일부 기능을 CPU에서 구동하는 소프트웨어 방식보다 더 빠르게 수행할 수 있는 하드웨어의 사용을 말합니다. 예를들면, GPU의 블리팅 가속 기능이 있죠. 블리팅 가속이 뭔지 몰라도 컴퓨팅의 일부 기능을 GPU에서 한다고 생각하시면 될 것 같아요. 보통 하드웨어 가속은 GPU를 활용하기 때문에 GPU 가속이라고 합니다.


GPU 가속장치는 그래픽 처리 장치, 부동 소수점 장치 등이 있고, 이들로 인해 빠른 연산을 가능하게 합니다 (부동 소수점 이야기는 다음 글에서 하도록 할게요~)


(GP)GPU는 복잡한 연산을 하기 위한 방향으로 발전되고 있어요. 그 대표적인 예가 딥러닝 연산이죠. 

딥러닝 연산을 고려하는 하드웨어가 발전하면 이를 뒷받침해주는 딥러닝 기반 소프트웨어도 발전해야겠죠? 그래서 나온 라이브러리(소프트웨어)가 cuDNN ((NVIDIA) CUDA Deep Neural Netowkr)이에요. (cuDNN 역시 NVIDIA에서 만들었답니다). 그렇기 때문에 딥러닝 관련 연산을 빠르게 해줄 수 있도록 도와주는 라이브러리로 구성되어 있답니다.


좀 더 정확히 NVIDIA가 정의한 cuDNN은 아래와 같아요.


"The NVIDIA CUDA Deep Neural Network library (cuDNN) is a GPU-accelerated library of primitives for deep neural networks."


"cuDNN provides highly tuned implementations for standard routines such as forward and backward convolution, pooling, normalization, and activation layers."


"cuDNN accelerates widely used deep learning frameworks, including Caffe2, Keras, MATLAB, MxNet, PyTorch, and Tensorflow."






<사진6>






지금까지 GPGPU, CUDA, cuDNN을 통해서 실제로 GPU가 과학연산에서 어떻게 실행되는지 알아봤어요.

다음 글에서는 본격적으로 NVIDIA GPU 모델 아키텍처에 대해 설명해보도록 할거에요. 


다른 GPU 모델도 있지만 최근에 보편적으로 사용하는 모델이 NVIDIA GPU 모델이기 때문에 NVIDIA GPU 모델을 살펴보도록 하겠습니다~





[글 래퍼런스]

http://haanjack.github.io/cuda/2016/02/26/gpgpu-cuda.html


[사진 래퍼런스]

사진1

https://namu.wiki/w/GPGPU

사진2

https://ko.wikipedia.org/wiki/CUDA

사진3

https://hw-lab.com/nvidia-announces-cudax86.html

사진4

https://www.slideshare.net/npinto/iap09-cudamit-6963-lecture-01-gpu-computing-using-cuda-david-luebke-nvidia-presentation

사진5

https://www.slideshare.net/maheshkha/cuda-tutorial

사진6

https://news.developer.nvidia.com/cudnn-7-5-now-available/

안녕하세요~


이번글에서는 내장그래픽과 외장그래픽에 대해서 알아보면서 그래픽카드의 내부구조 동작 방식에 대해 간단히 알아보도록 할거에요. 

그리고 딥러닝을 돌리시다보면 CUDA memory allocation error 라는 메시지 또는 GPU 메모리 관련 메시지가 발생하는데 이러한 이유에 대해서도 알아보도록 하겠습니다~







<1.딥러닝에서 GPU가 필요한 이유>


행렬과 같은 연산을 할때 CPU는 각각의 행렬 elements들을 순차적으로 계산하게 됩니다. 그런데, 행렬이 연산되는 방식을 보면 굳이 순차적으로 할 필요없이 각각의 elements들을 병렬적으로 계산할 수 있다는 사실을 알 수 있어요. 


단순히 3D 그래픽 처리를 위해 고안된 그래픽카드가 오늘날 tensor 계산을 기본으로 하는 딥러닝 연산에 최적으로 적용된셈이죠. (딥러닝 구조가 대부분 numpy 패키지로 구성되어 있다는 점 아시죠?ㅎㅎ)


<사진1>







<2.내장그래픽 VS 외장그래픽>


그래픽카드를 이야기할때 보통 내장그래픽과 외장그래픽으로 나누게 됩니다.


내장그래픽은 보통 CPU 내부에 있는 그래픽카드를 의미하고, 외장그래픽은 CPU 외부에 있는 그래픽카드인 셈이죠. (CPU 내부에 있나, 외부에 있나 그 차이에요!)


사실 내장그래픽만으로도 배틀그라운드 같은 게임도 충분히 돌아가지만 좀 더 생동감 넘치는 게임을 하기위해서는 더 높은 사양의 그래픽 카드를 필요로 해요. 그렇기 때문에 대부분 외장그래픽을 구매해서 모니터와 연결한답니다.


<사진2>



이는 게임뿐만아니라 앞에서 했듯이 딥러닝 또는 복잡한 과학계산을 할 때도 마찬가지로 그래픽카드가 이용됩니다. 그런데 왜 오늘날 딥러닝 모델을 학습시키기 위해서 내장 그래픽이 아닌 외장그래픽을 사용하게 되는걸까요? 







<3.내장그래픽>


CPU의 내장그래픽이 동작하려면 CPU와 마찬가지로 메모리에서 데이터를 읽어들여와야 합니다. 

CPU는 메인메모리 전부를 자신의 공간처럼쓰지만 내장그래픽은 함부로 그렇게할수가 없어요. 그렇기 때문에 내장그래픽이 메인메모리의 일부를 자신의 전용메모리로 사용할건지, 공유해서 사용할할건지 사전에 결정해야 한답니다.


"내PC->오른쪽 마우스 클릭 -> 속성" 으로 접속하시면 가끔 실제 메모리보다 적은 양의 메인메모리가 사용가능하다고 나오는데 이는 메인메모리의 일부(0.11=8.00-7.89)가 내장그래픽의 전용메모리로 잡혀있기 때문이에요. 


<사진3>




하지만 제 컴퓨터 같은경우는 전용메모리로 잡아둔게 없네요. 그렇다면 메인메모리의 일부를 공유하고 있다는 말인데, 어떻게 확인할 수 있을까요?




"작업 관리자 -> GPU(내장그래픽) -> 성능 탭"을 보시면 메인메모리의 절반인 2G를 공유메모리로 사용하고 있어요 ㅎㅎ




그런데 생각해보세요. 딥러닝 모델이 보통 많은 용량을 차지하는데 이 모델을 학습시킬때 메인메모리에 올리고 내장그래픽이 사용한다고 하면 CPU가 과부하 걸리지 않을까요? 

또한 내장그래픽카드의 연산능력은 당연히 CPU크기가 커지지 않는한 비약적으로 좋아지진 않을거에요. 


차라리 외부에 장치를 두어서 그래픽 또는 병렬계산을 해주는 장치를 따로 두는게 좋지 않을까요? 그 장치에는 더 큰 용량의 전용메모리를 주면 CPU가 부담을 덜 수 있지 않을까요? 


위와같은 질문을 통해 오늘날 GPU라고 인식하고 있는 외장그래픽이 등장하게됩니다!





<4.외장그래픽>


앞선 질문들에 대한 해답으로 외장그래픽이라는 개념이 등장하게 됩니다.


우리가 흔히 보는 GPU는 외장그래픽을 의미합니다.

외장그래픽이 하는일은 병렬계산과 같은 일을 CPU가 던져주면 해당 내용을 자신들의 전용메모리인 VRAM에 저장시킵니다. 그리고 GPU에서 VRAM에 접근해 작업을 처리하게 됩니다. 쉽게 말해 외장그래픽에서 CPU역할을 GPU가, RAM역할을 VRAM이 한다고 보시면 됩니다.  

<사진4>



외장그래픽카드도 공유메모리를 이용할 수 있지만 전용메모리(Directed GPU memory usage)크기가 내장그래픽보다 큰것을 볼 수 있죠?




외장그래픽에 자체메모리를 두는 또 다른 이유는 고속연산을 하기 위해서에요. 일반 메인메모리는 기본적으로 많은 양의 process를 올려서 CPU가 언제든지 접근할 수 있게 준비해주는게 필요하고, GPU는 특정 계산을 고속으로 처리해주어야 하기 때문에 메인메모리보다는 작지만 외장그래픽 내부에 자체 메모리를 두어 메모리 접근에 대한 물리적 거리를 단축시켜주게 됩니다.



이렇게 자체메모리를 두기 때문에 딥러닝 같은 모델을 GPU에 올려놓고 학습데이터들을 GPU에 batch size만큼 올려주게 됩니다. 그런데 GPU의 메모리가 적다면 무거운 딥러닝 모델도 올리지 못할거에요. 딥러닝 모델을 올린다고 하더라도 잔여 메모리양(= 기존 VRAM - 딥러닝 모델 용량)이 많지 않기 때문에 training dataset의 batch size를 크게 잡아서 학습을 진행시키면 "CUDA allocation error (GPU 메모리양이 부족하다는 뜻)" 메시지가 출력된답니다. (batch size가 딥러닝 일반화 성능에 크게 영향을 미친다는 논문도 발표된거 보면 GPU의 메모리가 얼마나 중요한지 아시겠죠?)




딥러닝을 위해서는 CPU보단 GPU가 더 중요한것 같은데, 그렇다면 아래와 같은 질문에 대해선 어떻게 생각하시나요?


"Q.CPU는 저사양으로 사용해서 돈을 절약하고, GPU만 고사양으로 사서 컴퓨터를 맞추면 되나요?"


결론부터 말씀드리면.....

 

"A.GPU 성능과 CPU의 성능차이가 많이 나면 서로간에 통신을 할때 병목현상이 생기기 때문에, 어느정도 서로 스펙을 맞춰줘야해요!"


그럼 이제부터 GPU와 CPU간의 병목현상이 왜 생기는지 알아보도록할게요!





<5.GPU와 CPU간 병목현상>


아래 그림처럼 GPU가 일을 하기 위해서는 CPU로부터 작업을 할당받아야해요.

외장그래픽(여기서부터는 GPU라고 할게요)에는 자신의 자체 메모리(ex:VRAM)이 있어요. GPU또한 CPU와 비슷한 역할을 하기 때문에 어떤 작업을 하기 위해서는 메모리에 접근해야해요. 그래서 CPU가 DMA를 통해 GPU가 작업할 일을 GPU의 메모리(VRAM; 아래그림에서는 Device memory)에 올려두게 됩니다.



<사진5>




1) 병목현상의 원인1 - CPU와 GPU간의 성능차이


앞서 GPU는 CPU에게서 작업을 할당받는다고 했죠? 

만약 작업이 마무리되면 어떻게 될까요?

물론 다시 CPU에게 자신의 작업이 완료됐다는 사실을 알리고 CPU는 이에 따른 작업을 수행하기 될거에요.



<사진6>



그런데 만약 CPU는 성능이 낮아 다른 업무들도 빠르게 처리하기 버거운데, 성능좋은 GPU는 자신의 작업을 빠르게 마무리하게 계속해서 CPU에게 주면 어떻게 될까요? 결국 CPU는 할일이 쌓여만 가는데 우선순위 때문에 GPU관련된 task를 수행하지 못하고 있을거에요. 


사람입장에서는 CPU가 GPU의 일을 빨리 처리해주지 못하다보니 "GPU의 성능이 좋지않군" 이렇게 판단하게되고 GPU는 굉장히 억울한 입장에 놓일거에요.


이렇게 CPU가 성능이 떨어져 GPU의 성능을 뒷받침 하지 못하는 경우를 CPU와 GPU간의 병목현상이라고 부른답니다.



Bottleneck calculator(링크)에 접속하시면 아래와 같은 그림이 생성되요.



굉장히 낮은 성능의 CPU와 높은 성능의 GPU를 컴퓨터에 세팅한다고 하면 얼마나 큰 병목(bottleneck)이 생길까요?



대략 46%의 Bottleneck이 생긴다고 하네요.


  





친절하게 i7-8700k에 해당하는 CPU로 바꾸는게 좋겠다고 추천까지해주니 편하네요!








2) 병목현상2 - PCI Bus (Peripheral Component Interconnect Bus) = PCIe(express), (feat.NVLink)


앞에서 언급한 CPU와 GPU간의 병목현상의 또 다른 원인이 되는것이 PCI Bus에요.


PCI Bus는 RAM과 VARM 사이의 데이터 전송 통로입니다. 


<사진7.위에서부터 4, 16, 1, 16 레인>




기본적으로 PCIe bus의 성능이 좋지 않으면 VRAM에 전달해주는 데이터속도가 빠르지 않을거에요.


<사진8>




<사진9>






<사진10. CPU 스펙의 한 부분을 차지하는 PCIe version>








만약 Multi-GPU(ex; GPU1, GPU2)를 사용할 경우 GPU1과 GPU2가 서로 통신하려면 어떻게 해야할까요? 그냥 서로 통신하면 될 것 같은데, PCIe로 구성된 구조에서는 GPU1에서 PCI bus를 거쳐 다시 GPU2로 전송되게 됩니다.


이렇게 되면 GPU1, GPU2가 서로 직접적으로 통신하는것 보다 더 많은 시간이 소요될 수 있어요 (PCIe를 한 번 거친다는건 물리적 거리가 소용된다는 말이니까요)







이러한 문제를 해결하기 위해 NVLink를 지원해주는 GPU가 등장했는데요. NVLink는 쉽게 말해 GPU간의 통신을 빠르게 해주기 위해 GPU들을 연결해주는 장치라고 생각하시면 될거에요.


<사진11>


PCIe 3.0 레인의 전송속도는 8GT/s 인 반면에, NVLink는 20Gbit/s (PCIe 3.0 대비 2.5배) 전송속도를 자랑하며, GPU1&GPU2 인접한 GPU간의 전송은 40Gbit/s 라고 합니다 (GT/s = Gbit/s 라고 간주하셔도 됩니다)



<사진12>



<사진13. PCIe VS NVLink 속도차이 with ResNet-50>





3) GPU 내부에서 발생하는 병목현상



GPU는 VRAM으로부터 데이터를 받아 연산을 수행하게 됩니다. 


많은 양의 데이터가 VRAM에서 GPU로 이동할때 시간이 좀 걸리겠죠? 

만약 GPU 할당받은 작업을 굉장히 빨리 끝낸다면 어떻게 될까요?


VRAM에서 GPU로 데이터를 이동시키고 있는 도중에 GPU가 이미 작업을 끝낸다고 하면 GPU 입장에서는 "나 일다 끝났는데 왜 빨리 다음일을 안주는거야.. 이러면 내가 놀게되잖아.."라고 하소연하며 VRAM이 작업물을 빨리 넘겨주지 않는다고 생각할거에요.




이러한 문제를 해결하기 위해서는 VARM에서 GPU 넘기는 대역폭이 커야해요. 대역폭이 크면 데이터를 빠르게 전송할 수 있게 되고, GPU가 작업을 마무리함과 동시에 새로운 데이터를 줄 수 있게 됩니다.







지금까지 내장그래픽과 외장그래픽의 차이에 대해서 알아보았어요.

또한 외장그래픽(GPU+VRAM+etc..) 성능을 극대화시키기 위해서는 어떤 요소들이 필요한지도 알아봤습니다.



다음 글에서는 간단하게 GPU의 구조에 대해 설명해보도록 할게요! 

GPU 구조를 아주 간단히 보여드리고 이를 뒷받침해주는 CUDA, cuDNN 이라는 병렬처리 플랫폼(or 소프트웨어)을 소개하도록 하겠습니다!~





 






[글 래퍼런스]

https://blog.inten.to/hardware-for-deep-learning-part-3-gpu-8906c1644664

책: 머신러닝과 블록체인을 떠받치는 GPU의 모든 기술



[사진 래퍼런스]

사진1,2

https://www.youtube.com/watch?v=tsB97IAejbk

사진3

https://m.blog.naver.com/PostView.nhn?blogId=ryujava&logNo=30168166523&proxyReferer=https:%2F%2Fwww.google.com%2F

사진4

http://www.11st.co.kr/product/SellerProductDetail.tmall?method=getSellerProductDetail&prdNo=2875791125&gclid=Cj0KCQjwiYL3BRDVARIsAF9E4Gd6siIhHGLIX6uQ_AgjVXK3XSvGI1T2f8VZ4NNaEfzJM7P7eztBvAIaAr53EALw_wcB&utm_term=&utm_campaign=%B1%B8%B1%DB%BC%EE%C7%CEPC+%C3%DF%B0%A1%C0%DB%BE%F7&utm_source=%B1%B8%B1%DB_PC_S_%BC%EE%C7%CE&utm_medium=%B0%CB%BB%F6

사진5

https://insujang.github.io/2017-04-27/gpu-architecture-overview/

사진6

https://www.slideshare.net/RenaldasZioma/trip-down-the-gpu-lane-with-machine-learning-83311744

사진7

https://m.blog.naver.com/PostView.nhn?blogId=rkalstn2&logNo=30180069244&proxyReferer=https:%2F%2Fwww.google.com%2F

사진8

https://blog.naver.com/alias_maya/20201203156

사진9

https://www.digitalcitizen.life/pci-express-pcie

사진10

https://www.anandtech.com/show/8426/the-intel-haswell-e-cpu-review-core-i7-5960x-i7-5930k-i7-5820k-tested

사진11

http://www.noteforum.co.kr/news/index.htm?nm=28621

사진12

http://playwares.com/sponsornews/57567833

사진13

https://www.pugetsystems.com/labs/hpc/TensorFlow-Performance-with-1-4-GPUs----RTX-Titan-2080Ti-2080-2070-GTX-1660Ti-1070-1080Ti-and-Titan-V-1386/

안녕하세요~


이번글에서는 인텔 CPU 모델 브랜드명을 어떻게 구분하는지 간단하게 설명해보려고합니다.





[인텔]

<1.Intel CPU 변천과정>


인텔의 CPU는 아래 그림과 같이 변화해왔어요.

코어 시리즈부터 메인 스트림급으로 사용되기 시작했는데, 메인스트림이란 고급형(대부분 서버형)에는 못 미치고 보급형보다는 좋은 중간에 위치한 등급을 의미해요. 한국같은 경우는 각 가정에 제공되는 PC 급으로 이해하시면 될 것 같아요. 

<사진1>




인텔 CPU는 출시하는 라인업으로 크게 분류가 되고 세부적으로 세대와 성능으로 또 구분 될 수 있어요.

세대는 Codename이라고 하고 나머지 숫자들이 성능을 의미하는데요. 대부분 세대 높아질수록 좋은 성능을 보여주고 있지만 모두가 그렇진 않아요. (2016:7세대=Kaby Lake, 2017:8세대=Coffe Lake, 2018:9세대=Coffe Lake Refresh, 2019:10세대=Comet Lake)




<사진2>




예를들면, i3 8세대부터 급격한 성능향상을 이루었어요. 사실 i3 8세대를 i5급으로 출시하는게 맞지만 CPU 시장에서 AMD 라이젠 시리즈에 밀리면서 i5보다 한 단계 낮은 i3로 출시하게됐어요. 더 낮은 단계의 세대로 CPU를 출시하면 가격을 좀 더 저렴하게 내놓을 수 있었기 때문이죠. 그래서 i5 7세대를 구매하신 분들보다 i3 8세대를 구매하신 분들이 가격과 성능면에서 훨씬 좋은 선택이었다라고 합니다~ (i3-8100 모델이 가성비가 좋다고하네요 ㅎㅎ)


그외에 i5도 8세대부터 급격한 성능향상을 보였다고 합니다 (i5 8세대부터는 6코어로 만들었다고 합니다). 위에서 처럼 i7 7세대 CPU를 i5 8세대로 팔았다고 하더라구요. (i7은 i5에서 hyper threading 기술이 추가된거라고 보시면 될 것 같아요. (Hyper threading을 모르신다면 -> 링크)






<2.라인업별 차이>










<3.세대별(Codename) 차이>







<사진3>






<4.서버급과 PC급의 차이>


보통 PC용으로 사용하는 컴퓨터는 Intel(R)이라는 브랜드명 마크가 붙어있어요.



반대로 서버급 CPU로 나온 인텔 CPU는 보통 Xeon(R) 이라는 브랜드명을 붙입니다 (물론 시간이지나면 PC용으로 쓰이겠지만요)


Xeon은 조금 모델명이 특이한데요.


<사진4>


일반적으로 아래와 같이 구분하고 있어요.


E3- 소규모 서버용, 저사양 워크스테이션용 CPU

제온 E3은 인텔 i7과 성능이 비슷해 일반 메인보다와 xeon E3 CPU가 호환되던 하스웰까지는 i7 대용으로 쓰이기도 했다고 합니다.


E5 - 중~대형 서버용, 워크스테이션용 CPU

E5부터 multi-processor(CPU를 2개 이상 장착) 구성이 가능해졌다고 합니다.


E7 - 대규모 서버용, 미션크리티컬(시스템이 중간에 멈추면 안되는 환경)

기업이 주문하면 제작, 판매하기 때문에 일반 사용자들은 구하기 어렵다고 하네요







<7.노트북 용 CPU VS 데스크 탑(PC)용 CPU>



<사진5>






<8.CPU 모델 성능비교 사이트>


우리가 어떤 CPU를 구매할때, 몇몇 모델을 비교해보고 싶을 때가 있을거에요. 이때 아래 사이트에 들어가 쉽게 성능비교후 CPU를 구매하면 좋을것 같아 소개해드리려고해요!


https://www.cpubenchmark.net/compare










이번글은 인텔 CPU 브랜드명과 각종 스펙이 어떻게 차이나는지 알아봤어요~

다음글에서는 AMD CPU 브랜드와 스펙을 구분해보도록 할게요~



[글 래퍼런스]

https://blog.naver.com/bsh9792/220788455994

https://post.naver.com/viewer/postView.nhn?volumeNo=15839425&memberNo=10558726


[사진 래퍼런스]

사진1,2

https://blog.naver.com/bsh9792/220788455994

사진3

https://www.dealconsultinginc.com/2018/04/15/intel-processor-generation/

사진4

https://www.servethehome.com/intel-xeon-e3-1200-v6-series-released-incremental-improvement/intel-xeon-e3-e5-e7-positioning/

사진5

https://blog.naver.com/meyouhappy/221551634613


안녕하세요~


이번글에서는 삼성이 왜 파운드리 시장에 뛰어들었는지에 대해 좀 더 다양하게 설명해보려고해요!

지난글에서는 단순히 CPU만 설명을 해드렸다면 이번에는 4차 산업혁명과 맞물려 삼성이 계획하고 있는 바에 대해서 설명드리도록 하겠습니다~




<1.AI Chip>


딥러닝을 하시는 분들이나 인공지능 관련해 복잡한 연산을 해보신 분이라면 순차적으로 계산하는 CPU가 얼마나 비효율적인지 느껴보셨을거에요. 그래서 딥러닝에서 대부분의 계산은 GPU가 담당하고 있죠.


그래서 GPU 회사인 NVIDIA의 성장세가 주목을 받고 있는데요. NVIDIA는 테슬라에 자율주행을 위한 GPU를 공급하고 있는데 이것이 4차 산업혁명에서 CPU 역할을 대체하고 있어요. 


그런데 GPU 같이 큰 장비는 저전력을 요구하는 IoT같은 기술에 접목되기 힘들다는 단점이 있습니다. 오늘날 AIoT, Edge Computing 기술이 주목받고 있는 시대에 CPU 보다는 효율적이고 GPU보다는 전력소모량이 낮은 새로운 연산장치를 요구하고 있는거죠 (AIoT, Edge computing 같은 것은 제가 나중에 소개해 드리도록 할게요 ㅎㅎ).


이러한 요구 끝에 AI chip이라는 새로운 분야가 탄생하게 됐어요. 4차 산업에 맞는 새로운 반도체 연산장체를 만드는 분야라고 보시면돼요. 


삼성은 AI chip 개발의 일환으로 2030년까지 NPU(Neural Processing Unit) 사업 인력을 기존 10배 이상인 2000명 규모로 확대한다고 선포했고, 추가적으로 AMD, Intel과 같이 연구개발중이라고 합니다. 



<사진1>


<사진2





<2.스마트폰의 CPU; AP(Application Processor)>


컴퓨터에는 CPU가 뇌의 역할을 한다면, 스마트폰에서는 AP가 뇌 역할을 합니다. AP는 CPU보다 더 많은 역할을 수행하게 되는데, 기본적으로 주 연산을 하는 CPU, 영상 연산을 하는 GPU, 통신기능 등이 하나의 통합된 칩 형태로 제공이된다고 보시면 될거에요 (경우에 따라서 RAM도 포함된다고 하네요). 


<사진3>


AP를 생산하는 대표적인 기업은 애플(A10 퓨전), 삼성(Exynos), 퀄컴(Snap Dragon)이라고 합니다. 애플과 퀄컴은 팹리스 회사이기 때문에 AP를 설계만 하고 AP을 생산하는 기업은 파운드리 회사인 TSMC에 맡기고 있습니다.


삼성이 파운드리 시장에 뛰어든건 앞선 chapter에서 말씀드린 CPU 보다 AP 시장을 겨냥했기 때문이라고 보는 경향이 더 많습니다. 과연 애플과 퀄컴이 계속해서 TSMC에다 자신의 AP 생산을 맡길 수 있을까요?






<3. 삼성의 움직임>


삼성은 파운드리 회사이기 때문에 AP를 생산할 수 있었던건 많이 알고 있는 사실이었지만, 더불어 AP 설계까지 한다는 점에서 삼성이 얼마나 AP 시장을 크게보고 있는지 짐작할 수 있었어요. 


하지만 삼성은 AP의 핵심 구성 요소 'Core'를 개발하던 연구 부서를 해체하고 이 분야의 강자인 영국 ARM의 기술을 삼성 자체 AP인 Exynos에 활용한다고 발표했습니다. 그래서 2019.10 즘에 발표한 최신 AP Exynos 시리즈 총 8종류 가운데 6개가 ARM의 설계대로 제작되었어요. 


삼성은 AP의 코어를 개발하는 대신 앞서 언급한대로 2030년까지 NPU 분야 인력을 기존 10배 이상인 2000명 까지 늘린다고 발표했어요. 


GPU또한 NVIDIA가 질주하고 있지만 삼성이 AMD와 공동 개발에 착수하기 시작하기까지 시작했다고해요 (GPU에서 NVIDIA와 AMD의 관계를 알고싶다면 --> 링크).


삼성은 4차 산업혁명 시대에 접어들어서 CPU 뿐만 아니라 AP, GPU 등 전반적인 시스템 반도체 분야영역에 뛰어들면서 시스템 반도체 파운드리 분야에서 세계1위를 하겠다는 다짐을 하게 됩니다.











<4.AP시장에서 퀄컴의 독주>


5G에 들어서면서 '모뎀'의 역할도 중요해 졌는데요. 나중에 5G와 모뎀에 대해서 자세히 설명드리고 여기서는 AP 관점에서만 보도록 할게요.

모뎀시장은 퀄컴(qualcomm)이라는 팹리스 회사가 독주하고 있는 상태에요. 모뎀과 AP를 통합시킨 Snap Dragon을 통해 AP시장에서도 1위 자리를 수성하고 있죠(2019년 기준).


애플은 퀄컴의 모뎀을 이용하고 있으며 삼성은 갤럭시S20에 자체 AP Exynos가 아닌 Snap Dragon을 장착시킬만큼 퀄컴의 Snap Dragon은 그 성능을 증명해내고 있어요. 


퀄컴 역시 팹리스 회사이기 때문에 자신들의 제품을 생산하는 건 TSMC에 위탁하고 있어요. 삼성이 파운드리 분야에 뛰어들긴 했는데 퀄컴이 삼성과 어떤 연결고리를 만들어낼지 두고보는것도 흥미진진 할 것 같습니다.






<5.스마트 제조사들이 독자 AP 가져야 하는 이유>


독자 AP를 가지고 있는 스마트폰 제조사들은 스마트폰의 출시를 마음대로 정할 수 있어요.

하지만 퀄컴과 같은 AP제조사들을 이용하는 경우라면 AP제조사들의 상황에 따라 스마트폰 출시계획이 변경될 수 있겠죠?


단적인 예로 올해 상반기 LG전자의 G6 스마트폰에는 최신 AP인 snap dragon인 835가 탑재될 예정이었어요. 그런대 퀄컴이 snap dragon 835의 일부 생산을 삼성의 파운드리에 맡기면서 초기 snap dragon 835 생산량 전량을 삼성이 가지가기로 했습니다. LG는 어쩔 수 없이 조금 떨어지는 성능이 snap dragon 821를 탑재하게 됨으로써 성능이 조금 떨어지는 스마트폰을 출시 할 수 밖에 없었죠.


반면에 화웨이는 자신들의 5G 기술을 접목시킨 독자 5G AP인 하이실리콘 기린 시리즈를 갖고 있기 때문에 화웨이 스마트폰을 출시계획을 문제없이 진행한다고 합니다.


하지만 미-중 무역전쟁으로 인해 다른 국가들이 화웨이 5G 장비를 사용하지 않겠다고 선언하고 있는 상태이기 때문에 이 부분도 어떻게 바뀔지 주목해봐야할 것 같습니다.







<6.(기사를 쓴 시점에서)최근 애플의 움직임>


지금까지 CPU 관련 글을 읽어보셨으면 최근 애플의 개발자 컨퍼런스인 WWDC에서 발표한 주요내용을 보고 정리한 아래 영상을 절반이상(?)은 이해하실 수 있으실거에요 ㅎㅎ






지금까지 CPU 관련 이론과 트렌드를 쫒아 가기위한 기본 용어들에 대해서 설명해보았어요.

다음글에서는 인텔의 CPU와 AMD CPU 모델에 대한 설명을 해보도록 할게요! ㅎㅎ~


[글 래퍼런스]

https://news.appstory.co.kr/howto9500

https://www.techm.kr/news/articleView.html?idxno=7298



[사진 래퍼런스]

사진1

https://news.samsung.com/global/infographic-automotive-intelligence-driven-by-small-packages-under-the-hood

사진2

https://www.slashgear.com/samsung-exynos-9820-finally-gets-its-own-npu-for-ai-13553641/

사진3

https://news.appstory.co.kr/howto9500


안녕하세요~


이번글에서는 CPU를 생산하고 있는 양대 산맥인 AMD와 Intel에 대해서 설명드릴까합니다.

그리고 최근 삼성과 관련된 기사들을 살펴보면서 CPU가 어떤 방향성으로 발전해나갈지도 살펴보도록 할게요!




<1.집적기술, Clock 성능을 높이다>


앞서 CPU의 clock속도가 CPU의 성능을 평가하는 중요지표가 될 수 있다고 말씀드렸죠?

그렇다면 CPU의 clock속도는 어떻게 높일 수 있을까요?


CPU의 Clock 속도를 증가시키려면 core수를 증가시켜야해요. 하지만 core수를 늘리면 발열문제가 생기겠죠? 


하지만 반도체 공정을 향상시키면 위와같은 문제를 해결할 수 있어요. 반도체 공정을 향상 시킨다는 이야기는 집적기술이 향상된다는 것이고, 집적기술이 향상되면 발열이 줄어든다고해요 (이 부분은 트랜지스터와 관련된 내용이라고 하는데 자세히 알아보진 않을게요 ㅎㅎ).


아무튼 줄어든 발열만큼 core수를 증가시킬 수 있으니 clock 속도를 증가 시킬 수 있어요! 즉, 하나의 CPU에 얼마나 작은 nano 단위로 core들을 집적시킬 수 있느냐가 굉장히 중요한 이슈가 될 수 있어요.


<사진1>


<사진2>





<2.AMD와 Intel의 계획>


CPU를 제조하는 양대산맥은 AMD와 Intel이라 할 수 있어요. 


Intel은 2015년까지 10nm 의 집적기술을 이용하여 CPU의 성능을 높인다고 했어요. 


<사진3>


하지만 5년이 더 딜레이 된 후 10nm 집적기술을 이용한 CPU를 출시하게 됩니다. 2020년에 10nm 집적공정 기술을 적용하여 intel CPU를 만들어 냈고 추후 7nm 공정을 이용한 CPU 모델인 Ice Lake를 출시하겠다고 발표했어요 (모델에 대한 자세한 설명은 다음에 하도록 할게요!).


<사진4>




하지만 AMD CPU인 라이젠은 이미 7nm에 대한 직접공정기술을 마무리했고 상품을 출시했다고합니다.


<사진5>


그렇다면 7nm 공정인 AMD 라이젠을 사용하면 되는건가요???

답부터 말씀드리면 "아니에요!"





<3. 집적기술 이외에 중요한 요소들>


CPU의 성능을 평가할 때 집적기술 외에 또 다른 중요한 요소가 무엇이 있을까요?


1) CPU 아키텍처


아래그림은 Intel의 i5 8400 모델과 AMD의 R5 1600x 모델 모두 14nm 집적공정기술로 만들어진 CPU이지만 아래 성능(ex:FPS (Frame Per Second))에서 인텔의 i5 8400 CPU가 더 뛰어나다는걸 알 수 있어요.


<사진6>



아래는 인텔과 AMD의 CPU 아키텍처 구조에요. AMD는 core수를 늘리기에는 용이하지만 core와 memory간의 물리적인 latency가 증가하기 때문에 성능에 문제가 일어난다고 합니다.


<사진7>



지금처럼 봤들이 CPU의 성능을 판단하기 위해서는 굉장히 많은 요소들을 따져봐야 하는데요. 좀 더 자세한 내용을 알기 원하시는분은 아래 영상을 참고해주세요!









<4.인텔과 AMD의 결정적인 차이; 반도체 공장>


인텔과 AMD의 가장 큰 차이점은 자체 반도체 공장의 존재 여부입니다. 


인텔은 CPU를 설계하고 이것을 만들어낼 공장이 있지만, AMD는 CPU를 설계만 할 뿐 설계된 도면을 바탕으로 CPU를 생산하는 회사는 TSMC라는 대만회사에요.


그럼 지금부터 설명할 내용들을 이해하기 위해서 몇 가지 용어들을 설명해보도록 할게요!


1)비메모리 반도체

- 우리나라에선 삼성이 메모리 시장을 독점하고 있기 때문에 "반도체=메모리"라는 인식이 강합니다. 반도체에는 CPU 같은 제품도 있는데 우리나라에선 CPU를 제작하는것이 생소하다 보니 메모리 이외의 CPU같은 제품들은 비메모리로 분류하고 있어요


2)시스템 반도체

- 삼성전자 내부에서는 CPU관련 제품을 언급할 때 비메모리 반도체라는 용어보다는 시스템 반도체라는 용어로 사용하고 있어요. 


3)시스템 LSI(Large Scale Integration-대용량 집적회로)

- 시스템 LSI는 하나의 작은 칩에 수만개의 회로가 몰려 있다는 뜻인데 시스템 반도체라는 개념이 시스템 LSI를 포괄하고 있다고 생각하시면 됩니다.


4) Logic-Chip

- 논리적인 연산을 수행하는 반도체란 뜻이기 때문에 보통 CPU 관련 제품을 의미해요. 해외에서는 시스템 반도체라는 용어를 쓰진 않고 전부 Logic-Chip이라는 용어를 사용한다고 합니다. 실제 블룸버그와 같은 외신들이 자주 사용한다고 해요. 


5)팹리스(Fabless: 공장이 없다는 뜻)

- AMD는 반도체 설계만 하고 있고 제조는 하지 않는다고 말씀드렸어요. 이렇게 반도체 제조공장이 없는 회사를 팹리스라고 부른답니다. 생산시설에 대한 투자대신 설계에 집중하는것이죠. 사실 애플도 팹리스로 분류된답니다.


6)파운드리(Foundry)

- 팹리스 회사의 설계도면을 바탕으로 관련제품을 생산하는 회사를 말합니다. 위에서 언급했듯이 AMD는 TSMC에 CPU 생산을 맡기기 때문에 TSMC를 파운드리 회사라고 합니다. (삼성이 이 분야에 도전장을 냈죠!)




<6.삼성 파운드리>


삼성은 TSMC가 독점하고 있는 파운드리 시장에 도전장을 냈습니다.

과연 삼성은 어떤 기술이 있기에 이러한 도전장을 냈을까요?

혹시 EUV라고 들어보셨나요? 2019년 일본이 수출규제로 제시했던 품목중에 포토레지스트가 EUV를 만드는데 중요한 요소라고 설명했던 뉴스를 보실 수 있으실거에요.




EUV란 반도체 집적공정기술으로 이해하시면 될 것 같아요. 앞서 10nm, 7nm 단위로 반도체를 집적시켜 만들 수 있다고 말씀드렸죠? 그런데 EUV 기술을 이용하면 7nm보다 더 작은 단위로 반도체를 집적시킬 수 있다고해요. 이러한 공정기술이 있다면 AMD, Intel 같은 회사가 계속해서 TSMC 회사만 이용할 순 없을거에요 (물론 현재는 두 회사 모두 EUV 기술이 있지만 2018년만해도 EUV기술은 삼성만이 갖고 있던 유일한 기술이었답니다)



 



인텔은 자체적으로 반도체 공장을 갖고 있음에도 불구하고 AMD에 비해 지속적으로 반도체공정에서 밀리는듯 한 모습을 보였는데요. 그랬기 때문일까요? 2019.11월 인텔은 회사창립 후 최초로 삼성에 CPU를 위탁생산을 맡기게 됩니다. 


TSMC에 CPU 위탁을 맡겼던 AMD는 어떤 움직임을 보일까요? 2019.12월 AMD 수석 부사장인 Ruth Coter는 삼성에게 CPU 공정 생성 위탁을 맡길 계획은 없냐는 질문에 "시간이 지남에 따라 삼성, TSMC 등의 조합을 생각해 볼 순 있지만 아직까진 TSMC와 GF(또 다른 파운드리회사)로만 충분히 요구를 충족시키고 있습니다"라고 아리송하게 답변을 내놓았습니다.


과연 삼성은 TSMC를 제칠 수 있을까요?


그런데, "단순히 CPU 하나만 갖고 삼성이 저렇게 무모하게 뛰어 들었을까?" 라는 의문이 들게될거에요. 그래서 다음 글에서 삼성이 지금 왜 CPU관련 시스템 반도체 파운드리 분야에 목숨을 걸고 있는지 좀 더 설명해보도록 할게요!









[글 래퍼런스]

http://news.kmib.co.kr/article/view.asp?arcid=0924083749&code=11151400

https://www.youtube.com/watch?v=vjVvhlp90SE


[사진 래퍼런스]

사진1

https://kr.123rf.com/photo_88213172_%EC%A4%80%EB%B9%84%EB%90%9C-%ED%94%84%EB%A1%9C%EC%84%B8%EC%84%9C%EC%99%80-%EC%B5%9C%EC%8B%A0-cpu%EB%A5%BC-%EA%B0%96%EC%B6%98-%EC%8B%A4%EB%A6%AC%EC%BD%98-%EC%9B%A8%EC%9D%B4%ED%8D%BC-%ED%94%84%EB%A1%9C%EC%84%B8%EC%84%9C%EC%9D%98-%EC%95%9E%EB%A9%B4%EA%B3%BC-%EB%92%B7%EB%A9%B4-%ED%98%84%EC%8B%A4%EC%A0%81%EC%9D%B8-%EB%B2%A1%ED%84%B0-%EC%9D%BC%EB%9F%AC%EC%8A%A4%ED%8A%B8-%EB%A0%88%EC%9D%B4-%EC%85%98-.html

사진2

https://www.youtube.com/watch?v=vjVvhlp90SE

사진3

https://dvdprime.com/g2/bbs/board.php?bo_table=pc_players&wr_id=122667

사진4

https://www.csitquestions.com/blog/intel-ice-lake-server-roadmap-delayed-struggles-to-make-appearance

사진5

https://eteris.tistory.com/1740

사진6,7

https://www.youtube.com/watch?v=vjVvhlp90SE&t=1s

안녕하세요~


이번글은 Multi-Core, Thread, Context switching이라는 개념을 설명을 드리고 CPU 스펙을 평가하기 위한 기본 이론지식을 마무리하도록 할거에요~






<1.Clock>


CPU는 메모리에서 명령어를 처리하는 역할을 한다고 했죠? 그렇다면 CPU가 명령어를 처리하는 속도는 어디서 기인할까요?


바로... Clock 입니다!


Clock이라는 건 초당 0,1이 얼마나 반복될 수 있는지를 보여주는 CPU의 성능지표에요. 즉, Clock이 빠를 수록 더 많은 0,1을 처리할 수 있게되기 때문에 더 빠르게 명령어들을 처리할 수 있게 되는거죠. 예를들어, 1Hz라고 한다면 1초당 0과1이 한 번 반복하는것이고, 1MHz라고 한다면 초당 0,1이 백만번 반복하게 되는거에요.


<사진1>



그래서 2004년까지는 CPU의 성능을 높이기 위해 Clock 속도를 높였는데요. Clock 속도를 높이자 CPU의 발열문제가 발생하기 시작했어요. 그래서 이때부터 Single core가 아닌 core를 두 개로 늘리는 전략을 구성하기 시작한것이죠. 생각해보면 process들이 서로 종속되지 않은 경우가 많기 때문에 하나의 core에서만 동작할 이유는 없었던거죠.


Core의 수가 더 많이지면 서로간의 발열문제가 더 심해질 수 있어서 single core에서 1.8Hz를 사용했다면 dual core에서는 각각 1.3Hz 정도로 낮춰서 사용하게 됩니다.



제가 사용하고 있는 "Intel Core i5-9600K processor"를 인터넷에 검색해보니 6개의 core를 사용하고 있다고 되어있네요. "윈도우키->작업 관리자->CPU->성능 탭"을 보니 정확히 6개의 코어가 작동되는걸 볼 수 있어요.


그런데 core밑에 thread라고 되어 있는데, thread는 무엇일까요?

바로 알아보도록 할게요!









<2. Thread>


Single Core에서 Dual Core로 기술이 발전하면서 CPU의 성능은 좀 더 좋아지기 시작했어요. 

CPU 설계자들은 더 좋은 CPU를 개발하려고 하다 문뜩 "하나의 Core에서 하나의 process만 동작하는데 이 process를 병렬로 구현시키면 어떨까?"라는 생각을 하게 됐어요.


Code를 작성해서 program을 만들때,  각각의 코드들이 고유의 영역을 갖는다는 사실 기억하시죠? (기억이 안나신다면 --> 링크)


<사진2>



<사진3>



Stack 영역 같은 경우는 해당 함수가 실행되고 나면 바로 메모리에서 소멸되기 때문에 굳이 process 내의 모든 요소들이 stack을 공유할 필요는 없어요. 예를들어, 지역함수가 실행된다고 해서 다른 code, data, heap에 있는 요소들이 stack의 정보를 필요로 하는건 아니니까요. 하지만 반대로 Code, Data, Heap 같은 영역의 데이터들은 stack이 공유해야 할 필요가 있어요. 단순한 예를들면, 지역함수가 실행되도 전역함수를 사용할 수 있기 때문이죠.


그래서 사람들은 process에서 code, data, heap 영역은 공유자원으로 하고 stack 같은 건 따로 병렬적으로 처리해도 되겠다라고 판단한거에요. 그래서 이러한 stack을 처리하기위해 thread라는 개념이 탄생하게 된거죠.


<사진4>


각각의 Thread는 process의 code, data, heap영역을 공유하고 stack을 별도로 처리하게 됩니다. 그렇다면 Thread도 자신들의 자료구조가 있겠죠? (Process의 PCB처럼요!)


우리는 Thread의 자료구조를 TCB(Thread Control Block)이라고 부른답니다. 대부분의 PCB와 비슷하지만 아무래도 process의 일부 영역을 공유하고 있기 때문에 TCP는 PCB보다 더 단순하답니다 (굳이 TCB에 중복되는(공유하고있는) PCB 정보를 추가해줄 필요는 없잖아요?)


<사진5>



일반적으로 하나의 core에 하나의 thread를 두고 있지만, 하나의 core에 두 개의 thread를 동작시키게 하면 위에서 언급한것 처럼 stack을 병렬로 처리할 수 있기 때문에 CPU의 속도가 더 빠르다고 느껴질거에요. 이렇게 하나의 core에 두 개의 thread를 두는 기술을 Hyper Threading이라고 한답니다 (2002년도에 hyper threading 기술이 나온걸 보면 Single core -> Thread -> Dual Core 순서로 발전된거 같아요).



<사진6>




<사진7>



Core와 Thread는 다음과 같이 구분할 수 도 있어요.

Core: CPU 안에서 물리적 연산을 담당하는 곳

Thread: 운영체제(OS)에서 인식하고 작동하는 작업 단위


그렇기 때문에 간혹 "작업 관리자"를 보면 single core를 사용하고 있음에도 CPU를 2개로 인식하는 경우가 있는데 이게 운영체제가 2개의 thread를 2개의 core로 착각하고 있기 때문이에요.


<사진8>



Hyper threading 기술은 인텔에서 붙인 이름이고 AMD는 위와 같은 기술을 SMT라고 부른답니다~








지금까지 살펴본 개념을 봐도 CPU의 스펙을 살펴볼때 어렵지않게 보실 수 있으실거에요. 

그럼 다음시간부터는 CPU 제조사들에 대해 알아보고 해당 모델들을 살펴보도록 할게요~








[글 래퍼런스]

https://www.youtube.com/watch?v=_dhLLWJNhwY


[사진 래퍼런스]

사진1

https://documentation.help/NI-TClk-Synchronization/niTClk_overview.html

사진2

https://sfixer.tistory.com/entry/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%98%81%EC%97%ADcode-data-stack-heap

사진3

https://aerocode.net/199

사진4

https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html

사진5

https://www.geeksforgeeks.org/thread-control-block-in-operating-system/

사진6

https://www.youtube.com/watch?v=BYvuF3ziPHc&t=4s

사진7

https://www.youtube.com/watch?v=_dhLLWJNhwY

사진8

https://www.youtube.com/watch?v=_dhLLWJNhwY&t=2s



안녕하세요~


CPU를 보시면 x86, x64 아키텍처라는 걸 본적있으시죠? 

폴더갖은 곳에서도 x86, x64 폴더가 따로 존재하는것도 본적있으실거에요!


이번 시간에는 x86, x64가 어떤 개념인지 알아보기 위해 Core에 대해서 알아본 후, CPU, Memory, OS(Operating System)이 서로 어떤 연관을 갖고 있는지 알아보도록 할거에요.




<1.Core란?>


CPU는 기본적으로 메모리의 명령어를 읽고 해당 변수들을 register file에 저장시킨 후, ALU(산술연산장치)를 이용해 계산을 진행하게 됩니다. 그래서 CPU에서 핵심역할을 하는 요소가 보통 register file, ALU 부분이기 때문에 이들을 묶어 core라고 하게 되는거죠.


<사진1>



<사진2>


이 core가 한 번에 32bit 용량에 해당하는 명령어를 처리할 수 있으면 32bit CPU라고 하고, 64bit 용량에 해당하는 명령어를 처리할 수 있으면 64bit CPU라고 합니다. 64bit 명령어를 처리하려면 Core가 좀 더 커야 겠죠? ㅎㅎ


또한 core의 개수에 따라 quad core, dual core 로 나뉠 수 있는데 단순히 quad core가 core개수가 더 많으니까 quad core로 사야겠다가 아니라, 해당 core가 32bit 명령어를 처리할 수 있는 체계를 갖추었는지, 64bit 명령어를 처리할 수 있는 체계를 갖추었는지에 따라 구매 기준이 달라진다는점 알아두시면 좋아요!


<사진3. 실제 CPU는 아니지만 개념을 이해하는데 적절한 그림이라 이용했습니다.>







<2.CPU 명령어 체계 그리고 Memory와의 관계>


앞서 언급한 32bit 명령어 체계, 64bit 명령어 체계라는건 구체적으로 무엇을 의미하느걸까요?


명령어 체계는 크게 실행 코드(op(eration) code)와 피연산자(operand) 부분으로 구성됩니다. 만약 "1+2"를 수행하라는 명령어는 ADD라는 opcode와 R1=1, R=2 라는 operand로 구성되어 있을거에요.


<사진4>


위에서는 8bit 단위가 4개로 구성된 명령어 체계이니 32bit 명령어 체계라고 할 수 있겠죠?

만약 64bit 명령어 체계라면 훨씬 더 복잡한 명령어들을 처리할 수 있을거에요.


메모리 챕터를 보신 분들은 아시겠지만 (못 보셨다면 --> 링크)


명령어들은 메모리에 cell 단위(8bit=1byte)로 저장되는데, 이때 32bit 명령어(8bit=1Byte=1 cell X 4)를 처리한다는 뜻은 한 번에 4개의 cell을 참조할 수 있다는 뜻이에요.


CPU는 자신들이 참조하는 메모리의 주소를 관리하는 레지스터(EIP, ESP)를 갖고 있어요. 32bit CPU는 32bit 명령어 체계를 처리해야하기 때문에 해당 레지스터는 32bit의 크기를 갖고 있답니다. 레지스터가 32bit 크기를 갖고 있으면 4G(2^32) 만큼의 메모리 주소에 접근 할 수있게되요 (하나의 bit에는 0,1의 경우의 수가 있으니 32bit라고 한다면 2^32의 경우의 수를 나타낼 수 있겠죠? 즉, 2^32(=4,294,967,296)가지의 경우의 수를 다를 수 있고 각각의 경우의 수를 메모리 주소라고 한다면 32bit CPU는 4G(=2^32=4,294,967,296)의 메모리 주소를 커버할 수 있게 된답니다. 다른 말로하면 32bit CPU는 4GB 이상의 메모리를 사용하지는것이 무의미하다는 이야기이죠! 왜냐하면 CPU는 2^32=4GB 정도의 주소체계만 관리할 수 있으니까요!


<사진5>







<3. CPU x86, x64 아키텍처 그리고 운영체제와의 관계>


3-1) x86

앞서 CPU가 32bit 명령어 체계를 처리할 수 있으면 32bit CPU가 된다고 말씀드렸죠?

1990년대 Intel과 AMD가 32bit 명령어 체계를 처리할 수 있는 CPU를 설계했는데, 이때 인텔에서 32bit 명령어 체계(=8080 명령어세트)를 처리할 수 있도록 설계된 CPU를 x86 아키텍처라고 명명하게 되었어요. 


3-2) x64

x64는 1999년에 발표된 x86 기반의 64bit 명령어 체계를 처리할 수 있는 CPU 아키텍처에요. x86을 기반으로 했기 때문에 x86 확장판이라고도 불리며 'x86-64' 아키텍처라고도 불리고 있답니다. x64와 같은 개념으로 사용되는 용어로는 'AMD64', 'x86-64', 'EM64T', 'Intel64' 가 있답니다.



3-3)CPU와 운영체제의 관계


64bit CPU는 말 그대로 CPU 하드웨어 성능을 의미합니다. 그런데 만약 운영체제가 32bit만 지원가능 하다면 어떻게 될까요? CPU가 64bit 명령어 체계를 처리할 수 있으니 운영체제에서 운반해주는 32bit 명령어도 충분히 처리할 수 있을거에요 (64bit 명령어 체계에서 32bit만 사용하고 나머지를 0으로 처리하면 되니까요). 하지만 이런경우 32bit CPU를 쓰는것과 64bit CPU를 쓰는것에 큰 차이는 없을거에요.


반대로 CPU가 32bit인데 운영체제가 64bit라면 메모리에서 CPU로 명령어를 넘겨줄때 64bit 단위로 넘겨주므로 CPU 해석을 하지 못할거에요.


<사진6>




<사진7>











[사진 래퍼런스]

사진1

https://slideplayer.com/slide/7483714/

사진2

https://www.guru99.com/32-bit-vs-64-bit-operating-systems.html

사진3

http://www.itworld.co.kr/t/62079/%C3%AF%C2%BF%C2%BD%C3%88%C2%B5%C3%AF%C2%BF%C2%BD%C3%AF%C2%BF%C2%BD%C3%AF%C2%BF%C2%BD%C3%AF%C2%BF%C2%BD%C3%8C%C2%B5%C3%83%C2%A5/89627?page=0,1

사진4

https://kwonsye.github.io/computer%20science/2019/04/14/ca-4.html

사진5

https://www.cs.virginia.edu/~evans/cs216/guides/x86.html

사진6

https://eine.tistory.com/entry/64%EB%B9%84%ED%8A%B8-32%EB%B9%84%ED%8A%B8-CPU%EC%99%80-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC


'컴퓨터 하드웨어 > CPU(Central Processing Unit)' 카테고리의 다른 글

6.인텔 CPU 브랜드명 구분하기  (0) 2020.06.30
5.AI chip 그리고 퀄컴  (0) 2020.06.29
4.AMD, Intel 그리고 삼성  (0) 2020.06.29
3.Multi-Core와 Thread  (1) 2020.06.29
1.Process와 CPU scheduling  (0) 2020.06.28

안녕하세요~

이번장에서는 memory이 어떻게 구성되어 있고 용량은 어떻게 계산하는지 등에 대해서 알려드리려고 해요!





해당 chapter(컴퓨터 하드웨어) 첫 번째 글(링크)에서 배웠듯이 CPU가 어떤 명령어를 처리하려면 memory에 있는 명령어들을 불러들어야해요. 만약 CPU 성능이 굉장히 좋은데 memory용량이 제한적이라면 메모리에 로드된 process의 수가 적기 때문에 cpu가 놀고 있을 확률이 클거에요. 그렇다면 우리는 memory 용량을 어떻게 계산해야할까요?



<1. Cell>

메모리를 구성하는 기본단위를 cell이라고 불러요. Cell은 기본적으로 8bit단위로 구성되어 있고 이러한 cell들이 모여 하나의 physical memory라고 불러요.


<사진1>




우리가 64MB 메모리를 사용한다라고 하면 64MB는 어떻게 계산되는걸까요?

Cell 하나가 8bit로 구성 되어 있으니, 1Byte 단위로 계산 할 수 있을거에요. 1Byte가 1MB 용량이 되려면 2^20 byte가 되어야 해요. 2^20 byte가 되어야 한다는건 2^20개의 cell이 필요하다는 뜻이겠죠? 그래서 64MB라고 한다면 64x2^20 개의 cell이 필요하다는거에요.

 


<사진2>




<2. 16GB VS 8GB>


우리가 흔히 memory를 구매할 때, 16GB를 이용할지 8GB 2개를 이용할지 고민을 하게 되는데요.

일단 흔히 우리가 memory로써 구매하는 삼성의 DDR RAM의 구조부터 살펴보고, 어떻게 구성하는게 좋은건지 알아보도록 할게요.


2-1) RAM

우리가 흔히 메모리라고 하면 RAM이라고들 해요.

예전에 테이프 같은 것들은 데이터를 순차적으로 읽어야 했어요. 그래서 특정 노래를 들으려면 되감기나 빨리감기 같은것을 해야했죠. 이렇게 순차적으로 메모리에 접근하는 방식을 SAM(Sequential Access Memory)라고 해요.



<사진3>



하지만 이와 반대로 순차적으로 점근하는 것이 아닌 랜덤하게 특정 위치에 접근하여 특정 노래를 들을 수 있다면, 이러한 방식으로 메모리에 접근할 수 있다면 우리는 이것을 RAM(Random Access Memory)라고 해요. 흔히 CPU가 메모리에 특정 process를 실행시킬때 순차적으로 접근하는건 아니기 때문에 메모리를 RAM이라고 칭한답니다.



<사진4>



메모리(memory)는 RAM 이외에도 주기억장치(ROM or RAM), DRAM (Dynamic RAM) 등의 용어들과 혼합해서 사용한다는 점 알아두세요!



2-2) 16GB VS 8GB


하나의 physical 메모리가 차지하는 용량에 따라 전체 메모리 용량이 달라질거에요. 예를들어 "5-1"같은 경우는 전체 RAM 용량이 4G이고, physical memory 개수는 8개이기 때문에 하나의 physical memory는 0.5G라고 할 수 있어요.


<사진5-1. 4G RAM>



Physical memory의 크기가 좀 더 커지면 더 많은 용량을 담을 수 있겠죠? 아니면 physical memory의 크기가 커지지 않더라도 집적기술의 발달로 더 많은 cell을 하나의 physical memory에 집어넣을 수 있으면 모메모리 용량이 커질거에요. 아래 "5-2"같은 경우는 하나의 physical memory에 1G 용량이 들어있다고 보면 되겠네요.

<사진5-2. 8G RAM>



그렇다면 우리가 16GB 메모리를 구성한다고 했을 때, 16GB를 하나로 구성하는 방식과 8GB를 두 개로 구성하는 방식이 있겠죠? 어떤 방식이 더 좋을까요? (아래 영상을 참고하시면 더 자세히 이해하실 수 있어요!)



결론부터 대체적으로 8GB 메모리를 두 개로 구성하는게 더 좋은 경우가 많아요. 위의 영상을 보셨다는 전제하에 말씀 드리면 하나의 memory가 8개의 physical memory로 구성되었다고 했을 때, 16GB인 memory에서는 하나의 physical memory가 2GB 처리능력을 갖고 있을것이고, 8GB memory에서는 1GB의 처리능력을 갖고 있을거에요. 그럼 상황을 예를들어 어떤 방식으로 16GB 메모리를 구성하는게 좋은지 말씀드려볼게요.


상황1. 한번에 9GB 용량을 처리해야 할 경우

16GB는 16GB 만큼 처리할 수 있는 용량이 있으니 각각 physical memory에 2GB, 2GB, 2GB, 1GB 씩 할당시켜 주면 처리가 가능해요. 마찬가지로 8GB 2개로 구성된 구조에서는 각각 physical memory에 1GB, 1GB, 1GB, 1GB, 1GB, 1GB, 1GB, 1GB, 1GB 으로 할당시켜 줄 수 있어요. 8GB 2개로 나뉘어질 경우 process간 통신을 할 때는 물리적 거리로 인해 시간이 조금 느려질 수는 있지만 사람이 느끼기 힘든정도라고 하니 '상황1'에서는 어떤 방식으로 16GB 메모리를 구성하던지 큰 문제가 생기지 않을거 같아요.


상황2. Physical memory에 1GB 정도되는 작업량이 9개가 병렬로 오는경우.

이런 경우에는 16GB 메모리를 사용하게되면 하나의 physical memory에서 2GB를 처리할 수 있음에도 불구하고 1GB씩 밖에 작업이 진행되지 않기 때문에 결국 남은 1GB를 낭비하게되요. 더군다나 8개에 1GB씩 모두 할당시켰기 때문에 남은 1GB(=9GB-8GB)는 좀 더 나중에 처리가 된답니다. 하지만 8GB 2개로 구성된다고 했을때 결국 한 번에 메모리에 할당할 수 있으니 좀 더 빠르게 작업이 진행되겠죠?




그렇다면 제 메모리는 어떻게 구성되어 있는지 확인해 볼까요?

"윈도우키->작업 관리자->성능 탭->메모리" 순서로 보시면 24GB라고 표시과 되어있어요. 저는 실제로 16GB 메모리 하나와 8GB 메모리 하나를 이용해 24GB 메모리로 구성했답니다.





<3. CPU가 느끼는 체감속도>

CPU는 메인 메모리에 접근하는 시간과 L2 Cahce, SSD 같은 메모리에 접근하는 시간은 얼마나 차이가 날까요? (실제로 CPU가 Cahce, SSD같은 곳에는 접근하는 것이 아니고 SSD의 데이터가 메인 메모리에 업로드되고 업로드된 데이터를 CPU가 접근하는 것을 CPU가 SSD 데이터에 접근하는걸로 표현했어요)




  




지금까지 메모리에 대해서 알아봤어요!

다음 시간에는 SSD에 대해서 알아보도록 할게요~






[글 래퍼런스]

https://www.youtube.com/watch?v=Vj2rNQFvdDw


[사진 래퍼런스]

사진1

https://www.vectorstock.com/royalty-free-vector/real-random-access-memory-or-ram-computer-vector-27187049

https://hackerspace.tistory.com/entry/%EB%A9%94%EB%AA%A8%EB%A6%AC

사진2

https://www.slideserve.com/pandora-gilmore/6339255

사진3

http://item.gmarket.co.kr/Item?goodscode=969169514

사진4

https://slidesplayer.org/slide/14685169/

사진5-1

https://www.amazon.com/ROYEMAI-PC3-8500-240-pin-Upgrade-Desktop/dp/B081DK81LN

사진5-2

https://www.amazon.com/Rasalas-12800U-Unbuffered-Desktop-Memory/dp/B07N5XKYH5





안녕하세요~


이번시간에는 CPU의 스펙중 가장 큰 부분을 차지하는 코어와 스레드라는 개념에 대해서 알아보도록 할게요!


이번 시간은 다른 시간과는 다르게 C언어의 지식이 어느정도 있어야 이해가 가능해요ㅜㅜ

(그런데 조금 읽어보니 필요없을수도 있는것 같아요 ㅎㅎ)




<1.Program>


컴퓨터의 CPU는 메모리에서 명령어를 읽어드린다는 사실 기억하시죠? 또한 내가 어떤 프로그램을 수행시키려면 해당 프로그램이 Disk(SSD,HDD)에서 메모리에 업로드가 돼야한다는 사실도 기억하실거에요!


(기억이 안나시면 이 챕터를 참고해주세요! --> 링크)



그렇다면 프로그램이라는건 어떻게 구성되서 CPU에서 차례대로 진행되는 걸까요?


프로그램은 프로그래밍 언어로 구성되어 있어요. 아래 사진에서 C언어로 구성된 프로그램이 만들어 졌다고 가정해볼게요. C언어로 만들어진 프로그밍 언어들은 각각 역할에 따라 고유의 영역으로 나뉠 수 있어요. 


<사진1>


Code영역: for, while, if 와 같은 조건문이나 상수값 같은 경우는 코드가 실행되는 중간에 변경이 불가능해요. 그래서 컴파일(Compile) 과정에서 아예 기계어로 변경시켜 읽기전용(Read-Only)으로 만들어 놓은 곳이라고 보시면 될거에요. 예를들어, hex, bin 파일이 code영역에 해당되는 곳이라고 보면 되겠네요!


Data영역: 데이터 영역은 전역(global), 정적(static) 변수, array, 구조체(structure)가 저장되는 곳이에요. 지금 나열한 요소들의 특징은 프로그램이 종료되기 전까지 없어지지 않고 메모리 영역을 차지하고 있는다는 점이에요. 하지만 해당 값들은 변경이 될 수 있기 때문에 컴파일(Compile)과정에서 기계어로 번역되지는 못하고, 메모리에 크기만 결정되게 됩니다.


BSS영역: Data영역과 대부분 유사하나 BSS영역은 초기화되지 않은 전역, 정적 변수, array, 구조체가 저장되는 곳이라고 해요. 



<사진2>



Heap영역: 프로그램을 구성하다보면 의도적으로 프로그램이 동적으로 메모리를 할당받아야 하는 경우가 있어요. 그렇기 때문에 프로그램이 실행하는 중간에 크기가 결정이 됩니다. C언어에서는 malloc(), calloc() 과 같은 함수가 이러한 역할을 하게되는데, 이때 이러한 역할을 하는 요소들을 모아놓은 곳이 heap이에요.


Stack영역: C언어에서 흔히 사용되는 지역변수, 매개변수, 리턴 값 등이 이곳에 해당됩니다. 이곳은 해당 코드가 실행되고 종료되면 바로 사용했던 메모리를 반납합니다. 그래서 이 역시 또한 프로그램이 실행하는 중간에 크기가 계속해서 바뀌게 되는거죠. 


Heap과 Stack 영역은 실행 중간에 크기가 바뀌기 때문에 중간에 해당하는 영역을 일정공간 비워두게 됩니다. 그런데 프로그램 코드를 잘 못 작성하게 되면 서로의 영역을 침범하는 경우가 발생하는데요. Heap 영역이 너무 많이 생겨 Stack 영역을 침범하는 경우는 heap overflow라고 하고, 그 반대는 stack overflow라고 합니다.


<사진3>



이렇게 하나의 프로그램이 완성이되면 하나의 단위로써 Disk에 저장되게 됩니다.






<2.Process>


프로그램을 만들어 Disk(SSD, HDD)에 저장시켰으면 실행시켜봐야겠죠?

우리가 프로그램을 실행시키면 운영체제가 Disk에서 해당 프로그램을 메인메모리에 올려주게 됩니다.


그럼 프로그램이 (CPU가) 실행 가능한 형태로 변경이되는데요. 이때 메모리에 올라가 실행준비가된 프로그램을 process라고 부릅니다. 실제로 process의 정의는 "process is program in execution"이라고 합니다. 



<사진4>



Disk에 있던 program이 메모리에 올라와 process가 되었다는건, 다시말해 program이 CPU가 이해할 수 있는 구조인 process로 변경되었다는것을 의미하겠죠? 그렇다면 CPU가 이해할 수 있는 process의 구조란 무엇을 의미하는걸까요? 답부터 말씀드리면 PCB가 CPU가 이해할 수 있는 process의 (자료)구조라고 할 수 있어요!




<3.PCB(Process Control Block)>


좀 더 구체적으로 CPU가 이해하기 위해서 process는 어떤 구성요소를 갖고 있어야 할까요? 즉, PCB는 어떻게 구성되어야 하는걸까요?


1)PID (Process ID)

- 프로세스의 고유한 번호에요. 당연히 각각의 프로그램의 고유ID가 있어야 서로 고유의 (메모리)영역을 침범하지 않겠죠? 그리고 프로그램간의 통신을 하는 경우도 발생할 수 있으니 서로 누구인지 인식할 수 있는 ID가 있어야 하기 때문에 PID라는 개념이 생겨났어요.


2)State

- Process의 현재상태를 의미해요. 이 부분은 바로 뒤에 CPU Scheduling 부분에서 설명하도록 할게요.



<사진5>


3)Pointer

- process가 위치하고 있는 메모리 주소 정보에요. 각각의 프로세스는 고유의 영역을 갖고 있다고 말씀드렸는데 해당 영역의 위치정보를 갖고 있어야 하기 때문에 Pointer라는 것이 존재해요.


<사진6>



4)Priority

- 이 부분도 CPU scheduling에서 자세히 설명하도록 할게요.


5) Program counter

- 하나의 process 내에서 다음에 실행될 명령어 주소 값을 가지고 있어요


6)I/O information

- Process가 할당 받은 I/O 자원들에 대한 정보에요. 이 부분도 아마 CPU scheduling을 보시면 더 명확히 이해하실 수 있으실 거에요.


7) Accounting information

- CPU를 사용한 시간 정보입니다.



앞서 '2)State, 4)Priority, 6)I/O information 에서 CPU scheduling에 대해서 언급한 바 있었는데요. 간단하게 CPU scheduling이 무엇인지 알아보도록 할게요!






<4.CPU Scheduling>


우리가 컴퓨터에서 작업을 할 때, 대부분 하나 이상의 프로그램들을 실행시키게됩니다. 이때 프로그램들이 메모리에 업로드되어 각각 고유의 process들이 되는데요. 그렇다면 CPU는 아래 그림처럼 process1 작업이 다 끝날때까지 다른 process에는 접근을 안할까요??  만약 Process1을 실행시키다가 굳이 CPU가 하지 않아도 될 작업들이 진행될 때, cpu가 다른 process의 일을 처리하고 다시 process1으로 접근하면 더 효율적이지 않을까요?


<사진7>


위와 같은 질문을 통해 나온 개념이 CPU scheduling이라는 개념이에요. 우리는 운영체제라는 시스템이 CPU가 놀지 않도록 process의 상태에 따라 cpu를 scheduling하도록 설계했답니다. 즉, 수 많은 process가 하나의 CPU를 점유하려고 달려들때 운영체제가 CPU를 문제 없이 점유 하도록 process들을 scheduling(관리) 해준다는 개념인거죠!



<사진8. CPU scheduling>



하나의 예를들어볼까요?


특정 process는 CPU에 의해 실행이 되다가 프린트 또는 다른 입출력 장치를 이용할 경우 다른 process에게 CPU를 양보하게 됩니다. 생각해보면 '워드 2장을 프린트로 출력'하는 행위는 CPU가 하는게 아니라 프린터가 하는거에요. 그래서 CPU가 워드 2장에 대한 내용만 프린터에 전달해주면 CPU의 역할을 끝나게 됩니다. 그런데 CPU가 프린터가 끝날때 까지 기다려야 하나요? 아니죠! 그래서 프린터와 같이 CPU와는 별개의 작업이 진행될 때는 해당 process가 잠시 대기 상태('2)State')가 됩니다.

그런데 만약 프린터작업이 끝났을 경우에는 어떻게 할까요? 만약 워드 프로그램에서 프린터 작업이 마무리 되면 알아서 프로그램이 종료가 되나요? 아니죠! 프린트 작업이 마무리 되려면 CPU가 해당 '워드 프로그램에게 프린터 작업 종료해!'라고 말해야해요. 안그러면 다른 문서를 프린트하려고 하면 '현재 계속 프린트가 작동되고 있습니다'라는 메시지를 전달할거에요...


그래서 프린트 작업이 끝나면 대기가 되었던 process를 다시 CPU가 점유해야해요. 그런데 다른 process들도 있는데 어떻게 CPU를 다시 점유할 수 있을까요? 이러한 문제 때문에 I/O 같은 작업으로 인해 CPU를 양보해주는 process들은 이 작업이 끝나면 가장 먼저 CPU를 점유할 수 있도록 해줍니다. 즉, CPU를 선점할 수 있는 우선권('4)priority')를 제일 높게 설정해주는거죠!




그렇다면 실제로 우리 컴퓨터에서는 얼마나 많은 process가 동작하는지 볼까요?


"윈도우키 -> 작업 관리자 -> 성능 탭" 순서로 보시면 CPU의 process가 얼마나 많이 실행되는지 볼 수 있을거에요.  



이번 시간에는 Process와 CPU scheduling에 대해서 알아봤어요.

Process의 개념과 PCB라는 개념을 이해하고 있어야 core와 thread에 대한 개념을 좀 더 명확히 이해할 수 있기 때문에 다뤄봤습니다.

다음 시간에는 CPU, Memory, 운영체제간의 관계를 좀 더 디테일하게 알아보고 32bit, 64bit가 뭘 의미하는 것이고 CPU에서 x86이라는건 뭘 나타내는것인지 알아보도록 할게요!





[글 래퍼런스]

https://jungwoon.github.io/android/2019/07/16/Process-Thread/



[사진 래퍼런스]

사진1

https://sfixer.tistory.com/entry/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%98%81%EC%97%ADcode-data-stack-heap

사진2,3

https://aerocode.net/199

사진4

https://copycode.tistory.com/39

사진5

https://jungwoon.github.io/android/2019/07/16/Process-Thread/

사진6

https://docsplayer.org/117139474-Microsoft-powerpoint-o8-pptx.html

사진7

https://slidesplayer.org/slide/14685169/

사진8

https://itdexter.tistory.com/390


+ Recent posts