전자전기공학/컴퓨터구조

[컴퓨터 구조][Parallel]

Sim 2024. 11. 13. 14:32
반응형

 

 

 

 

 

 

 

 

컴퓨터 구조에서 병렬처리는 여러 프로세서를 연결하여 성능을 향상시키는 것으로

Scalability(확장성)을 확보하며, 전력 효율성을 높이기 위해서 사용됩니다.

 

 

컴퓨터 구조에서 병렬처리에는 ILP, DLP, TLP라는 세 가지 주요 용어가 있습니다.

 

 

 

 

 

ILP(Instruction Level Parallelism)

 

 

 

 

 

ILP는 Instruction level parallelism으로 단일 프로그램 내에서

독립적인 명령어들을 병렬로 실행함으로써 성능을 향상시키는 기술입니다.

 

ILP에 사용되는 주요 기술에는 이전에 저희가 많이 배웠던 Pipelining이 있고,

다음 시간에 배울 Out of order Execution과 Superscalar가 있습니다.

또한 branch predictor와 hazard detector등 모든 것들도 ILP의 성능을 증가시킬 수 있는 요소입니다.

 

Out of order는 다음 시간에 배울것이기 때문에 Superscalar를 알아보자면,

한 사이클에 여러 명령어를 동시에 실행할 수 있도록 여러 실행 유닛을 사용하는 것 입니다.

 

 

 

1    LOAD R1, [R2, #0]
2    ADD R3, R1, R4 ; R3 = R1 + R4
3    MUL R5, R6, R7 ; R5 = R6 * R7
4    SUB R8, R9, R10 ; R8 = R9 - R10

 

 

위의 코드를 Superscalar로 실행한다면

 

1C(cycle) : LOAD R1, [R2, #0] + MUL R5, R6, R7

2C : ADD R3, R1, R4 + SUB R8, R9, R10

 

이렇게 명령어 간의 독립성을 활용하여 동시에 실행 가능한 명령어들을 병렬로 처리하는 것 입니다.

여기서 VLIW와 Superscalar에 대해서 헷갈리실 수 있는데, VLIW는 명령어를 하나의 긴 명령어로 묶는 것 입니다.

[LOAD R1, [R2, #0] | ADD R3, R1, R4 ; R3 = R1 + R4 | MUL R5, R6, R7 ; R5 = R6 * R7 | SUB R8, R9, R10 ; R8 = R9 - R10]

VLIW는 위와 같이 묶는 것이고, Superscalar는 아래의 예로 보자면 두개의 명령어를 병렬로 처리하는 것 입니다.

 

1C : $\begin{matrix} \text{LOAD R1, [R2, #0]} \\ \text{ADD R3, R1, R4} \end{matrix}$

 

여기서 LOAD와 ADD를 동시에 수행하는 것 입니다.

 

2C : $\begin{matrix} \text{MUL R5, R6, R7 ; R5 = R6 * R7} \\ \text{SUB R8, R9, R10} \end{matrix}$

 

LOAD와 MUL 명령어는 서로 독립적이기 때문에 동시에 실행이 가능하고 이것은 ADD와 SUB또한 마찬가지 입니다.

독립적이라는 이유는 Register들이 서로 의존성을 가지고 있지 않기 때문이라는 것은 아실 것 입니다.

 

만약에 독립적이지 않고 서로 의존성을 많이 가지고 있다면 ILP의 성능이 올라가는데에는 한계가 분명히 존재합니다.

 

 

여기서 Issue라는 의미가 있는데 이 의미를 잠깐 짚고 넘어가겠습니다.

 

Issue는 명령어가 Execution단계로 보내지는 것을 말하는 것으로,

한 사이클 동안 몇 개의 명령어를 CPU가 동시에 실행할 수 있는지를 나타내는 지표가 됩니다.

 

 

 

 

 

 

 

DLP(Data Level Parallelism)

 

 

 

 

DLP는 같은 연산을 여러가지 데이터 요소에 동시에 적용하는 병렬성입니다.

 

주로 SIMD 구조에서 많이 이용하게 됩니다.

 

 

 

 

DLP에는 위의 네 가지 경우에 따라서 나뉘게 됩니다.

SISD : Single Instruction Single Data,

SIMD : Single Instruction Multiple Data

MISD : Multiple Instruction Single Data

MIMD : Multiple Instruction Multiple Data

 

이 네 가지의 경우에서 MISD는 실상 의미가 없습니다.

그 이유는 하나의 데이터에 대해 서로 다른 연산을 동시에 수행할 필요가 있는 경우가 드물기 때문입니다.

 

쉽게 예를들어서 하나의 숫자를 동시에 더하고 빼는 것은 연산의 순서가 중요하기 때문에 사용할 일이 없습니다.

일부 특수한 경우에는 사용되기도 하지만 특수한 경우를 제외하면 사용할 일이 없다고 생각하시면 됩니다.

 

 

 

DLP에서 주로 사용하는 경우는 SIMD와 MIMD입니다.

 

 

SIMD구조는 하나의 명령어를 여러 데이터 요소에 동시에 적용하는 방식입니다.

일반적으로 vector process나 GPU 등 고성능 연산이 필요한 분야에서 자주 사용됩니다.

 

vector execution을 위한 명령어에 대해서 살펴보자면,

Floating point 연산에서는 지금까지 배운 X, W이외에 S, D register가 사용됩니다.

 

S register는 32bit single precision연산을 위해서 사용하는 register입니다.

D register는 32bit double precision연산을 위해서 사용하는 register로 아래와 같이 사용됩니다.

 

 

 

● Single precision arithmetic

    

    FADDS, FSUBS, FMULS, FDIVS

     ex) FADDS S2, S4, S6

 

● Double precision arithmetic

 

    FADDD, FSUBD, FMULD, FDIVD

    ex) FADDD D2, D4, D6

 

  single and double precision comparison

 

     FCMPS, FCMPD

 

  Branch on FP condition code true or false 

 

    B.cond

 

 

 

이제 Vector execution을 위한 마지막으로 V register입니다.

 

여기는 명령어에 따라서 각 register가 몇 bit의 data를 가지고 연산을 수행할지 정할 수 있습니다.

 

128bit V register이기 때문에 128bit을 기준으로 나눠서 할당할 수 있습니다.

 

쉽게 이해하기 위해서 아래의 예시를 보시면,

 

16 8bit integer add

 

ADD V1.16B, V2.16B, V3.16B

 

여기서 16*8은 128bit으로 각 레지스터에 1Byte(8bit)을 기준으로 16개를 묶어서 연산합니다.

 

 

 

 

FP도 S또는 D register를 사용해서 연산을 수행합니다.

 

FADD V1.4S, V2.4S, V3.4S

 

 

 

이렇게 vector processing의 한 구조인 SIMD에 대해서 살펴봤습니다.

 

MIMD는 여러개의 코어 즉, multicore processor를 이용한 방식입니다.

독립적인 명령어 흐름을 가지며 서로 다른 데이터를 처리할 수 있는 것 입니다.

 

즉, 서로 독립된 공간인 코어1과 코어2에서 서로 다른 명령어를 수행하고 있는 것 입니다.

 

 

 

 

 

 

 

 

TLP(Thread Level Parallelism)

 

 

 

 

 

TLP는 multiple thread를 이용해 병렬수행하는 것을 의미합니다.

 

Thread에 대해서 저의 운영체제 포스팅을 보시면 아실 수 있듯이 단점도 존재하지만,

쉽게 생성하고 없앨 수 있다는 장점과 함께 서로 공유된 자원을 가지고 있어서 정보공유가 쉽다고 이야기 했었습니다.

 

 

TLP는 이런 장점들을 이용해서 설계하는 기법을 의미합니다.

 

multithreading의 예시에는 coarse multithreading과 fine multithreading 그리고 simultanuous multithreading이 있습니다.

 

 

 

 

 

 

이름에서도 알 수 있지만, coarse multithreading은 각 thread를 뭉터기로 하나씩 수행하는 것 입니다.

 

fine multithreading은 각 시간 단위 별로 각자의 thread A, B, C, D가 한번씩 병렬로 수행되는 것이며

 

simultaneous multithreading은 하나의 thread가 실행되더라도 또 다른 thread도 함께 실행하는 것입니다.

 

위에 그림을 보시면 이해가 더 쉬우실 것 입니다.

 

 


 

 

 

이렇게 컴퓨터구조의 parallel에 대해서 살펴봤습니다.

 

 

다음에는 Out-of-order에 대해서 알아보도록 하겠습니다.

 

 

감사합니다.

 

 

 

 

 

 

 

반응형

'전자전기공학 > 컴퓨터구조' 카테고리의 다른 글

[컴퓨터구조][Cache Coherence]  (1) 2024.11.21
[컴퓨터 구조][Out of order]  (2) 2024.11.15
[컴퓨터구조][virtual memory]  (10) 2024.10.27
[컴퓨터구조][cache#2]  (0) 2024.10.25
[컴퓨터구조][Cache]  (0) 2024.10.16