Computing

OpenCL on FPGA (1) 필요성과 Intel FPGA SDK for OpenCL 본문

가속기 Accelerator/FPGA

OpenCL on FPGA (1) 필요성과 Intel FPGA SDK for OpenCL

jhson989 2022. 5. 30. 21:11

이 포스터는 coursera의 Introduction to OpenCL on FPGA 강좌를 바탕으로 작성되었습니다.

Parallel Computing이 필요한 이유 : Single CPU 성능 향상의 벽

Single CPU의 성능이 더욱 좋아질수록 프로그램의 실행 속도는 빨라질 것이다. 하지만 single  CPU의 성능을 제한하는 3가지 벽(wall)들이 존재하는데, 바로 다음과 같다.

 

  • Power wall
  • Intruction-level parallelism wall
  • Memory wall

Single CPU의 성능이 증가할수록 CPU가 소모하는 파워가 증가하는데, 그에 따라 CPU의 발열량도 증가한다. 따라서 CPU의 성능이 증가하다 보면 더 이상 일반적인 쿨링 시스템으로는 감당 못하는 발열이 발생하는 순간이 오는데, 이러한 발열에 의한 CPU 성능 제한을 Power wall이라고 한다.

Eq 1. CPU에서의 전력 공식 [2]


Eq 1.은 CPU에서 소모되는 전력의 공식을 나타낸 것으로, c와 Ps는 상수, V는 전압, f는 clock frequency를 나타낸다. clock frequency가 증가할수록 일반적으로 CPU의 성능은 증가하는데, f에 선형적으로 소모되는 전력도 증가한다. 따라서 clock frequency를 증가시켜서 single CPU의 성능을 향상시키는 것에는 한계가 있다.

Intruction-levell parallelism(ILP)은 single CPU에서 한번에 연산되는 명령어의 개수를 늘리는 병렬화 방법이다. 이러한 병렬화는 한 clock 연산되는 instruction의 개수 (IPC, intructions per clock)을 늘린다. 이러한 ILP는 instruction pipeline을 통해 달성되는데, Fig 1.과 같다.

 

FIg 1. ILP를 위한 pipeline [1]


4번째 clock에서 동시에 4개의 명령어가 실행되는 것을 확인할 수 있다. ILP는 pipeline의 단계가 많아질수록 증가한다. (10개의 pipeline 단계가 있으면 10개의 명령어가 병렬로 실행될 수 있다.) 하지만 instruction간의 dependency와, branch 등에 의해 pipeline의 향상에는 한계가 있는데, 이러한 한계를 Intruction-level parallelism wall라고 한다.

마지막으로 Memory wall이 있다. 이것은 CPU의 문제라기 보다는, 폰 노이만 아키텍처의 본질적인 문제라고 생각한다.

 

FIg 2. 폰 노이만 아키텍처 [3]


Fig 2. 은 폰 노이만이 설계한 컴퓨터 아키텍처를 나타낸 것으로, 연산을 담당하는 산술장치(CPU)와 데이터 저장을 담당하는 메모리(DRAM)이 분리되어 구성된다. 따라서 CPU에서 off-chip DRAM에 접근하여 데이터를 읽어오는데는 오랜시간이 걸린다. 따라서 아무리 single CPU가 빨라지더라도, CPU가 요구하는 데이터 전송시간 자체가 오래걸리니 single CPU의 성능 향상에는 한계가 있다.

Parallel Computing

이러한 한계를 극복하기 위해 등장한 것이 parallel computing이다. Parallel computing은 여러 계산기 (여러 개의 CPU, GPU, FPGA, 혹은 여러 개의 컴퓨터)를 동시에 사용해서 컴퓨팅 성능을 올리겠다는 것이다.

앞서 언급한 3가지 벽에 의해 CPU 하나의 성능을 향상 시키는 것은 매우 어려운 문제가 되었다. 따라서 하나의 CPU를 향상시키는 것보다는 여러 개의 CPU를 동시에 사용하는 방향으로 computing이 발전해가기 시작하였다.

Parallel computing은 3가지 형태로 구분할 수 있는데, 이는 예전 강의에 정리해놓았다.
2022.03.15 - [Parallel Computing/개념] - Parallelism의 종류 : data vs task vs pipeline

하지만 이러한 parallel computing이라고 만능이 아니다. 바로 프로그래밍이 어렵다는 것이다. 일반적인 프로그램은 하나의 CPU가 어떻게 실행될지를 작성했다면, parallel computing은 여러 CPU가 어떻게 실행될지를 작성해야 한다. 따라서 매우 복잡해진다. 특히 여러 개의 CPU 사이에 data sharing이 있을 경우 프로그램을 짜기에는 더욱 어려워진다. 하나의 변수에 10개의 CPU가 동시에 접근할 경우 data race 문제가 발생할 수 있다. 따라서 barrier나 lock mechanism을 활용하여 shared data에 대한 접근을 제한하여야 한다.


Heterogeneous System

이러한 병렬 컴퓨팅 프로그램을 위해, 단순히 CPU만을 사용하는 것이 아닌 다양한 연산 장치를 동시에 사용해서 계산할 수 프로그램을 실행시킬 수 있도록 컴퓨터 시스템을 구성할 수 있다. 이를 heterogeneous system라고 한다. GPU, FPGA, DSP와 같은 연산 장치를 활용하여 연산의 효율화를 달성한다.

 

Fig 3. Multi-CPU, GPU, FPGA로 구성된 이기종 시스탬의 예시 [4]


일반적으로 single CPU는 control intensive 프로그램(searching, parsing)에 강하고, GPU는 data intensive 프로그램(image processing, data mining)에 강하다. FPGA는 개발자가 직접 회로를 설계할 수 있는 만큼, 좀 더 다양한 타입의 프로그램을 모두 최적화할 수 있다. 따라서 다양한 프로그램의 특성에 맞게 적절한 연산 장치를 선택할 수 있는 것이 heterogeneous system 장점이다.

하지만 heterogeneous program을 작성하기는 하나의 연산 장치만을 사용해서 parallel program (homogeneous progmra)을 작성하는 것보다 훨씬 어렵다. CPU, GPU, FPGA, DSP 각각을 위한 언어로 프로그램을 작성해서 실행시켜줘야 하기 때문이다. CPU 프로그램은 C, C++, Python 등 일반적인 컴퓨터 언어로 쉽게 프로그램을 작성할 수 있지만, GPU는 CUDA, FPGA는 verilog 등 그 하드웨어를 위한 언어로 프로그램을 작성해 한다.

이를 쉽게 하기 위해 Intel은 OpenCL, SYCL을 개발하고 있으며, 이와 같은 언어는 이 언어로 작성된 하나의 프로그램이 CPU, GPU, FPGA 모두에게서 실행될 수 있도록 하는 것을 목표로 개발되고 있다. 이번 포스터 시리즈는 OpenCL을 통한 FPGA 실행에 대하여 배워보고자 한다.


OpenCL & Intel FPGA SDK for OpenCL

OpenCL (Open Computing Language)은 이름 그대로 개방형 범용 병렬 컴퓨팅 프레임워크이다. CPU, GPU, DSP 등의 프로세서로 이루어진 이종 플랫폼에서 실행되는 프로그램을 작성할 수 있게 해 준다[5]. FPGA 제작사인 Intel(altera)는 FPGA 개발을 위한 OpenCL SDK를 배포하여 OpenCL을 통한 FPGA 프로그램 개발을 지원한다. Fig 4. 는 FPGA 프로그램 via OpenCL의 컴파일 과정을 나타낸 것이다.

 

Fig 4. Compiling a FPGA program via OpenCL


OpenCL로 작성된 프로그램은 host program과 kernels로 구성된다. host program은 CPU에서 실행되며 kernel들을 호출한다. Kernel은 multi-CPU, GPU, DSP, FPGA에서 실행되는 프로그램이다.

CPU에서 실행되는 OpenCL host program은 clang과 같은 기존의 C compiler로 컴파일된다. 하지만 다양한 하드웨어 실행되어야 할 kernel은 각 하드웨어 제작사에서 만든 컴파일러를 통해 컴파일되어 해당 하드웨어에서 실행된다. Intel FPGA의 경우 AOC 컴파일러를 통해 OpenCL kernel이 컴파일되어 FPGA의 회로로 작성된다.


Reference

[1] https://indico.cern.ch/event/59397/contributions/2050044/attachments/996317/1416877/SS_lazzaro.pdf
[2] https://physics.stackexchange.com/questions/34766/how-does-power-consumption-vary-with-the-processor-frequency-in-a-typical-comput
[3] https://ko.wikipedia.org/wiki/%ED%8F%B0_%EB%85%B8%EC%9D%B4%EB%A7%8C_%EA%B5%AC%EC%A1%B0#/media/%ED%8C%8C%EC%9D%BC:Von_Neumann_Architecture.svg
[4] https://www.youtube.com/watch?v=QY_bjwzsfMM
[5] https://ko.wikipedia.org/wiki/OpenCL