Computing

FPGA via SYCL - 1 : Tutorial 빌드 및 실행 in DevCloud 본문

가속기 Accelerator/FPGA

FPGA via SYCL - 1 : Tutorial 빌드 및 실행 in DevCloud

jhson989 2022. 5. 2. 23:17

High Level Languages for FPGA Programming : SYCL

2022.03.23 - [가속기 Accelerator/FPGA] - FPGA Design Concepts - 1 : Overview

이전 글에서 FPGA 프로그래밍을 위한 high level languages 개념 및 SYCL에 대해서 배웠다. 일반적으로 FPGA 프로그래밍을 한다는 것은 hardware description language(HDL)을 통해 회로가 어떻게 구성되는 지를 그리고 다른 IP core를 통합하여 실행가능한 회로를 만든다. 이를 컴파일하면 실제 FPGA 칩내에 회로를 구성할 수 있다.

 

SYCL은 C언어의 확장으로, 일반 소프트웨어 개발자에게 익숙하지 않은 HDL을 쓰지 않고도 SYCL C를 통해 FPGA 개발을 가능하게 해주는 high level languages 중 하나이다. 오늘 자료 [1], [2]를 참고하여 SYCL을 통한 FPGA 프로그래밍 tutoral에 대하여 정리하고자 한다. FPGA 개발 키트는 비싸고 일반적으로 잘 가지고 있지 않기에 공짜로 이용할 수 있는 Intel의 devcloud[3] 클라우드 환경에서 예제 개발을 진행하고자 한다.

Fig 1. SYCL 개발이 가능한 Intel® Stratix® 10 FPGA 개발 키트 [4]

 

 

SYCL FPGA 개발 과정 : FPGA Emulator와 FPGA Hardware 컴파일

FPGA 컴파일은 매우 시간이 오래 걸리는 작업이다. 간단한 high level code도 몇 시간 이상 걸릴 수 있다. 이는 hight level code를 HDL로 변환하는 과정보다는 HDL을 FPGA 하드웨어로 컴파일하는 과정이 매우 오래 걸리기 때문이다. FPGA는 configurable block인 ALMs의 2차원 배열로 이루어지는데, 이 block들 하나하나들에 기능을 부여하고 그들끼리의 wire를 연결하는 routing 작업이 진행된다. 특히 이 과정의 최적화된 하드웨어 디자인을 찾는 것은 NP 문제로 exponential time complexity를 가진다고 한다. (그렇게 기억하고 있는데 확인이 필요하다.) FPGA의 하드웨어 자원은 한계가 있기에, 컴파일러는 최대한 최적화된 회로를 구성하려고 하고 그에 따라 컴파일 시간이 오래 걸린다고 한다. 따라서 Just-In-Time (JIT) 컴파일은 불가능하며, 항 Ahead-Of-Time (AOT) 컴파일만 가능하다.

 

이렇게 오래 걸리는 컴파일은 프로그래머의 일 효율을 매우 떨어뜨린다. 예를 들어 프로그램을 작성하고 3시간동안 컴파일한 후 확인해 봤더니 +1을 했어야 했는데 -1을 했더라. 이 경우 프로그램을 수정하고 다시 컴파일을 3시간동안 돌려야 한다. 이처럼 성능이 잘나오는 지 확인도 하기 전에 프로그램이 제대로 동작하는 지 디버깅하는 작업 또한 오랜 시간이 걸릴 것이다.

 

이를 극복하기 위해 SYCL FPGA는 3가지 개발 단계를 제공한다.

 

  • FPGA Emulator
    • SYCL FPGA 코드를 CPU에서 실행시키는 단계
    • FPGA 코드가 제대로 동작하는 지 확인하는 단계. 이 단계에서는 FPGA에서 실행될 시의 성능은 전혀 예측할 수 없음. 이 과정을 통해 SYCL FPGA 코드가 정확히 작동하도록 디버그할 수 있음.
    • 컴파일 시간 : 초 단위
  • Optimization Report
    • SYCL FPGA 코드를 Verilog 코드로 변환하는 단계
    • 이 단계에서 FPGA에 생성될 회로의 구조 및 성능(성능 병목 지점, 리소스 사용량 등)에 대한 대략적인 리포트를 제공함. 이 정보를 바탕으로 SYCL FPGA 코드를 재구현 및 최적화할 수 있음.
    • 컴파일 시간 : 분 단위
  • FPGA Hardware
    • 실제 FPGA에 빌드되는 FPGA hardware image를 생성하는 단계
    • Verilog 코드 상의 회로가 FPGA 보드 내에 빌드됨. 실제 FPGA 보드 내에서의 코드 성능을 분석할 수 있음. 이 단계를 거치면 실사용 가능한 제품이 됨.
    • 컴파일 시간 : 시 단위

 

프로그래머는 위 3 단계를 거쳐 FPGA 프로그램을 완성한다. 각 단계는 여러 번 반복하여 수행하여도 되며, 이 과정을 통해 FPGA hardware compile의 단점을 보완할 수 있다.

 

 

 

Tutorial on DevCloud

 

GitHub - jhson989/sycl-fpga-devcloud

Contribute to jhson989/sycl-fpga-devcloud development by creating an account on GitHub.

github.com

위 프로젝트는 SYCL로 작성된 간단한 FPGA 튜토리얼이다. FPGA로 실행한 것이 CPU로 실행한 것보다 5배 정도 성능이 느린다. (성능이 매우 나쁘지만 좀 더 공부해서 차츰차츰 개선해 나가겠다.) 이번 포스터는 SYCL을 통한 최적화된 FPGA 코드 작성이 목표가 아니라, DevCloud에서 어떻게 FPGA 코드를 컴파일하고 실행시킬 수 있는 지에 대한 것이기에 성능은 잠시 무시하겠다.

 

SYCL의 목표는 single source code로 CPU, GPU, FPGA에서 실행할 수 있도록 하는 것이다. 따라서 source code를 바꾸지 않더라도 FPGA에서 실행할 수 있다. 다만 device로 FPGA를 사용한다는 것을 명시해줘야 한다.

// CPU 디바이스 선택
sycl::cpu_selector cpu;
sycl::queue cpu_q(cpu, properties); // CPU 디바이스 queue 생성

// GPU 디바이스 선택
sycl::gpu_selector gpu;
sycl::queue gpu_q(gpu, properties); // GPU 디바이스 queue 생성

// FPGA emulator 선택
sycl::ext::intel::fpga_emulator_selector fpga_emul;
sycl::queue fpga_emul_q(fpga_emul, properties); // FPGA emulator queue 생성

// FPGA 디바이스 선택
sycl::ext::intel::fpga_selector fpga;
sycl::queue fpga_q(fpga, properties); // FPGA 디바이스 queue 생성

 

SYCL FPGA 빌드를 위한 컴파일 옵션은 다음과 같이 주어야 한다.

#### FPGA emulator 빌드
dpcpp -fintelfpga main.cpp -o program.out

#### FPGA optimization report
dpcpp -fintelfpga -Xshardware -fsycl-link=early main.cpp -o fpga_compile_report.a

#### FPGA hardware 빌드
dpcpp -fintelfpga -Xshardware main.cpp -o program.out

 

DevCloud에 job을 submission하는 방법은 다음과 같다. (build.sh 및 run.sh 작성은 이전글을 참고)

2022.03.16 - [Parallel Computing/SYCL] - Intel DevCloud 실행 방법

#### Emulator submission
qsub -l nodes=1:fpga_compile:ppn=2 -d . build_emu.sh
qsub -l nodes=1:fpga_compile:ppn=2 -d . run.sh

#### Hardware submission
qsub -l nodes=1:fpga_compile:ppn=2 -d . build_hw.sh
qsub -l nodes=1:fpga_runtime:arria10:ppn=2 -d . run.sh
#qsub -l nodes=1:fpga_runtime:stratix10:ppn=2 -d . run.sh # 디바이스 선택

 

 

 

Reference

[1] https://github.com/oneapi-src/oneAPI-samples/tree/master/DirectProgramming/DPC%2B%2BFPGA/Tutorials/GettingStarted/fpga_compile

[2] https://devcloud.intel.com/oneapi/get_started/baseToolkitSamples/

[3] https://www.intel.com/content/www/us/en/developer/tools/devcloud/overview.html

[4] https://www.intel.com/content/www/us/en/products/details/fpga/development-kits/stratix/10-gx.html