Parallel computing에 대해 공부하고 싶어 이렇게 글을 파게 되었습니다. CPU는 프로그램을 돌리기 위한 연산을 수행하는 부품입니다. 아래 그림은 간단한 CPU 코어 한개에 대한 다이아그램입니다. 구체적인 프로세스로는 아래 그림에서와 같이 외부로부터 프로그램(instruction)를 받은 후 해석합니다. ("FETCH/DECODE") 해석된 프로그램 안에 포함되어 있는 명령어(=! instruction)에 따라 Arithmetic Logic Unit (ALU)에서 계산을 수행합니다. 편한 비유를 위해 명령어에 대한 예시를 하나 들도록 하겠습니다. 예를 들어 제가 "요리"에 대한 프로그램 (cook program)을 만들었다고 했을 때 이 program은 1) "채소를 씻어라", 2) "과일을 씻어라" 라는 두 가지 명령어를 지니고 있다고 합시다. 그러면 아래의 single cpu에 들어있는 ALU는 채소를 먼저 씻고, 그 다음에 과일을 씻게 됩니다.

만약에 CPU 한개 코어에 ALU를 하나 더 넣으면 어떻게 될까요? 이 경우에는 여전히 코어에 "Fetch/Decode"하는 부분이 하나 밖에 없으므로 프로그램 (cook program)을 하나만 받을 수 있습니다. 다만 프로그램에 들어 있는 명령어를 직렬이 아닌 병렬적으로 (parallel) 처리할 수 있습니다. 구체적으로는 ALU1가 "채소를 닦는 동안" ALU2는 동시에 "과일을 닦는" 겁니다. 여기서 저희는 이 SINGLE CORE CPU가 두 개의 thread를 처리할 수 있다고 합니다. 그리고 하나의 프로그램밖에 못받지만 여러개의 thread를 처리할 수 있는 cpu 시스템을 SIMD (Single Instruction Multiple Thread)라고 합니다.

만약 그림 1의 normal한 CPU 코어가 두개가 된다면 어떻게 될까요? 당연하게도 코어가 두개가 있기 때문에 ALU도 두개가 있고 따라서 두 개의 명령어(thread) 를 각 core에 전달함으로서 동시에 명령어를 두개를 처리할 수 있습니다. 다시 말하자면 이 double core system은 두 개의 thread를 동시에 처리 가능합니다. 다만 위의 SIMD와 다른 점은 "한 개"의 프로그램에 들어있는 명령어를 동시에 처리하는 것도 가능하지만, "두 개"의 다른 프로그램을 받는 것도 가능하다는 겁니다. 왜냐면 이 시스템에 "Fetch/Decode"하는 부분이 두개가 있으니 프로그램도 두개를 받을 수 있습니다
예를 들면 위에서 말씀드린 "COOK PROGRAM" 말고 청소 프로그램 "CLEAN PROGRAM"이 있다고 가정해봅시다. "Clean program"은 1) 청소기 돌리기 2) 먼지 닦기 라는 명령어로 구성되어 있다고 하면..
SIMD의 경우
(1) COOK PROGRAM ALU1 : 채소닦기 / ALU2: 과일닦기 -> CLEAN PROGRAM ALU1: 청소기돌리기 ALU2: 먼지닦기
의 일처리 옵션만 존재하지만
더블 코어의 경우 (1)번 옵션 말고도 다음 옵션이 가능합니다
(2) Core 1의 ALU : 채소닦기 / Core 2의 ALU: 청소기돌리기 -> Core의 ALU: 과일닦기 Core2의 ALU: 먼지닦기

그러면 아래의 예시는 어떨까요? 아래에는 core가 4개가 있고, 각 코어에 ALU가 8개씩 있습니다.
따라서 이 시스템은 4개의 INSTRUCTION(PROGRAM)을 동시에 받을 수 있습니다. 그리고 8*4=32개의 thread를 동시에 처리할 수 있습니다.

아래는 인텔 cpu의 예시입니다. 보시면 core가 24개, thread는 32개라고 적혀있는 걸 볼 수 있습니다. 이 의미는 32개의 thread를 동시에 처리할 수 있다는 이야기입니다.
마지막으로 GPU는 그림 2의 SIMD를 엄청 때려박은 시스템이라고 볼 수 있습니다. 즉 한 개의 INSTRUCTION을 받을 수 있는 "Fetch/Decode"에 CPU에서보다 더 많은 ALU를 엄청나게 박아놓은 겁니다. 이 경우에는 코어가 20개, FETCH/DECODE가 80개 (코어당 4개), ALU는 2560개 (FETCH/CODE당 32개, 코어당 128개) 입니다. 따라서 80개의 INSTRUCTION을 동시에 받을 수 있고, THREAD는 2560개를 동시에 수행할 수 있습니다.


그러면 이러한 측면에서 보았을 때 parallel computing이라는 건 어떤 프로그램을 여러개의 명령어 덩어리 (명령어 그룹1, 명령어 그룹2, ...) 로 쪼개고 cpu의 여러개의 LPU를 이용해 각 명령어 그룹들을 각자 맡아서 동시에 계산해서 빠르게 처리하는 걸 의미합니다. 이를 위해서는 developer 입장에서는 프로그램 코드를 cpu가 알아먹을 수 있는 방법으로 쪼개주는 게 중요합니다.

이러한 프로그래밍을 하는 방법으로 openmp, mpi, cuda 등이 있다고 합니다. 다음 글에서는 우선 cpu 기반으로 간단한 예제를 공부해보고자 합니다.