크로노스 그룹(Khronos Group)의 OpenCL™ 표준을 FPGA에 활용하면, 현재 제공되고 있는 CPU, GPU, DSP 등과 같은 하드웨어 아키텍처 성능이 대폭 향상되고 전력을 한층 더 낮출 수 있다. 또한, OpenCL 표준을 이용하는 FPGA-기반 이종 시스템(CPU+FPGA)은 Verilog, VHDL 등과 같은 상대적으로 낮은 레벨의 HDL을 사용하는 전통적인 FPGA 개발보다 빠른 타임-투-마켓 이점을 제공한다.
글│데사난드 싱 (Deshanand Singh)
소프트웨어 및 IP 엔지니어링 감독 수석 엔지니어
알테라 코포레이션
(Altera Corporation)
프로그래머블 기술의 초기에는 2개의 각기 다른 극단의 프로그램 가능성을 포함하고 있었다. 그림 1에 나타낸 바와 같이, 첫 번째 극단은 싱글 코어 CPU와 DSP로 대표된다. 이러한 디바이스는 실행될 명령 리스트로 구성된 소프트웨어를 통해 프로그램이 가능했다. 실행 시 이러한 순차적인 프로그램으로부터 명령-레벨 병렬성(parallelism)을 추출하기 위해서 첨단 프로세서가 명령을 재정리할 수는 있었지만, 이들 명령은 프로그래머에게 개념적으로 순차적인 방법으로 개발됐다. 반대로, 다른 하나의 극단적인 프로그래머블 기술은 FPGA로 대표됐다. 이들 디바이스는 완벽하게 병렬로 실행하는 구성 가능한 하드웨어 회로를 개발함으로써 프로그램됐다. FPGA를 사용하는 설계자는 근본적으로 매우 정밀한 병렬 애플리케이션을 개발하고 있다. 수년 동안 이들 극단은 각기 다른 애플리케이션 영역에 적용되는 각각의 프로그램 가능성 형태로 공존했다. 하지만, 최근 기술 확장 경향은 프로그램 가능하면서 병렬인 기술을 선호하고 있다.
성능에 대한 요구가 증가함에 따라, 순차적인 프로그램을 실행하는 소프트웨어-프로그래머블 디바이스는 성능을 향상시키기 위해 두 가지 기본적인 트렌드에 의존했다. 첫 번째는 제조공정 세대가 진화함에 따라 동작 주파수를 확장하는 것이었다. 그러나, 다양한 이유로 인해 적절한 전력 밀도를 유지하면서 동작 전압을 낮추고 동작 주파수를 줄이는 트렌드를 더 이상 지속할 수 없게 됐다. ‘파워 월(power wall)’이라고 알려져 있는 이 현상은 모든 종류의 프로그래머블 디바이스의 아키텍처에 상당한 변화를 불러일으키고 있다.
소프트웨어 프로그래머블 디바이스가 의존하고 있는 두 번째 트렌드는 순차적인 프로그램으로부터 명령-레벨 병렬성을 추출하는 복잡한 하드웨어의 출현이었다. 그림 2에 나타낸 바와 같이, 싱글-코어 아키텍처는 일련의 명령을 입력하고 많은 병렬 기능 유닛을 제공하는 디바이스 상에서 이를 실행한다. 프로세서 하드웨어의 상당 부분이 순차적인 코드로부터 동적으로 병렬성을 추출해야만 한다. 또한 하드웨어를 통해 메모리 지연(memory latency)을 보상하려고 시도했다. 일반적으로 프로그램머는 크고 일정하며 한결같이 빠른 메모리가 있는 것처럼 프로세서의 기본 메모리 체계를 고려하지 않고 프로그램을 개발한다. 그에 반해 프로세서는 외부 메모리에 대한 고-레이턴시와 제한된 대역폭 연결의 물리적 현실을 처리해야 한다. 데이터가 유입되는 기능 유닛을 유지하기 위해서 프로세서 역시 이론적으로 데이터를 외부 메모리로부터 온-칩 캐시로 프리패치(prefetch) 해야 하기 때문에, 데이터는 연산이 수행되는 곳에 보다 더 가까이 있어야 한다. 이러한 기법을 사용하여 수십 년 동안 성능이 향상되었으나, 이러한 형태의 아키텍처를 통한 성능 개선이 상당히 약화되고 있다.
전통적인 프로세서 아키텍처에 대한 이러한 두 가지 트렌트의 이점이 약화되면서 우리는 그림 3에 나타낸 바와 같이 다양한 소프트웨어-프로그래머블 디바이스가 이제 상당히 진화했다는 것을 알게 됐다. 실행 시 자동적으로 명령-레벨 유사성을 추출하는 것에서 코딩 시 쓰레드-레벨 유사성을 확실하게 식별하는 것으로 주안점이 이동했다. 보다 많은 트랜지스터가 유사성의 캐싱과 추출보다는 연산을 위해 사용되는 보다 간편한 복수의 프로세서를 포함하는 일반적인 트렌드와 함께 고도의 병렬 멀티코어 디바이스가 나타나기 시작했다. 이러한 디바이스는 일반적으로 2, 4, 8개의 코어를 포함하고 있는 멀티코어 CPU에서부터 데이터-병렬 연산을 위해 최적화된 수백 개의 간단한 코어로 구성된 GPU에 이르기까지 다양하다. 이러한 멀티코어 디바이스에서 고성능을 달성하기 위해서 프로그래머는 병렬 방식으로 자신의 애플리케이션을 명료하게 코딩해야만 한다. 모든 코어가 협력하여 특정 연산을 실행할 수 있도록 각 코어에 작업이 할당되어야만 한다. 이것은 또한 FPGA 설계자가 자신의 하이-레벨 시스템 아키텍처를 개발하기 위해 수행하는 작업과 정확히 일치한다.
새롭게 등장하고 있는 멀티코어 시대를 위한 병렬 프로그램 개발에 대한 요구를 고려할 때, 이와 같이 상당히 다른 디바이스 모두에서 실행할 수 있는 프로그램을 개발하기 위한 표준 모델이 있어야 한다는 것을 인식하게 됐다. 이러한 각기 다른 프로그래머블 기술에 포팅이 가능한 표준의 부족으로 인해 프로그래머는 어려움을 겪었다.
2008년 여름, 애플이 크로스-플랫폼 병렬 프로그래밍 표준을 개발하기 위한 활동의 일환으로 OpenCL (Open Computing Language) 초안 규격을 크로노스 그룹(Khronos Group)에 제안했다. 크로노스 그룹은 애플, IBM, 인텔, AMD, NVIDIA, 알테라 등과 같은 산업 회원으로 구성된 컨소시엄이다. 이 그룹은 OpenCL 1.0, 1.1, 1.2 등의 규격을 정의해왔다. OpenCL 표준은 최소한의 재코딩 작업으로 다양한 플랫폼에 포팅할 수 있는 병렬 알고리즘을 실행할 수 있도록 지원한다. 언어는 C 프로그래밍 언어에 기반하고 있으며, 병렬성의 규격을 지원할 수 있는 확장 기능을 포함하고 있다.
OpenCL 표준은 포팅 가능 모델을 제공하는 것뿐만 아니라, VHDL, Verilog 등과 같은 HDL보다 한층 더 높은 추상화 수준에서 FPGA 상에서 실행될 수 있는 병렬 알고리즘을 본질적으로 기술할 수 있다. 이와 같은 보다 높은 수준의 추상화 기능을 제공하기 위해 많은 하이-레벨 신세시스 툴이 제공되고 있지만, 모두 동일한 기본적인 문제로 인해 어려움을 겪고 있다. 이러한 툴은 순차적인 C 프로그램을 포함하면서 병렬 HDL 실행을 생성하려고 시도해왔다. 어려움은 HDL 실행을 개발하는 것에서 뿐만 아니라, FPGA 실행을 높은 성능으로 달성하도록 지원하는 쓰레드-레벨 병렬성을 추출하는 것에서도 나타난다. 병렬 스펙트럼의 가장 극단에 있는 FPGA의 경우, 최소한의 병렬성을 추출하는 데 실패할 경우에 다른 디바이스에서보다 치명적이다. OpenCL 표준은 프로그래머가 병렬성을 명료하게 지정하고 제어할 수 있도록 지원함으로써 이러한 문제의 많은 부분을 해결한다. OpenCL 표준은 완벽하게 C로 기술된 순차적인 프로그램보다 FPGA의 높은 병렬 특성과 한층 더 자연스럽게 매칭된다.
OpenCL 표준의 개요
OpenCL 애플리케이션은 2개의 부분으로 구성된다. OpenCL 호스트 프로그램은 모든 종류의 마이크로프로세서 상에서 실행되는 표준 C/C++로 작성된 완벽한 소프트웨어 경로이다. 예를 들어, 이들 프로세서는 그림 4에 나타낸 바와 같이 FPGA의 임베디드 소프트 프로세서, 하드 ARM 프로세서, 외부 x86 프로세서 등이 될 수 있다.
이러한 호스트 소프트웨어 경로(routine)의 실행 시 특정 지점에 연산 집약적이면서 CPU, GPU, FPGA 등과 같은 보다 병렬적인 디바이스 상에서 높은 병렬 가속 기능을 통해 이점을 얻을 수 있는 기능이 있을 수 있다. 가속될 이러한 기능을 OpenCL 커널이라고 한다. 이러한 커널들은 표준 C로 작성된다. 하지만, 병령성과 메모리 계층을 지정하는 구조를 통해 주석이 달린다. 그림 5에 나타낸 예는 두 개 어레이 a와 b의 벡터 합(vector addition)을 수행하면서 결과를 다시 출력 어레이 답으로 작성한다. 병렬 쓰레드는 각 벡터 요소 상에서 동작하여 FPGA와 같은 상당한 정밀 병렬성을 제공하는 디바이스를 통해 가속화될 때 결과가 한층 더 신속하게 연산될 수 있도록 지원한다. 호스트 프로그램은 데이터가 FPGA로 전송될 수 있도록 지원하는 표준 OpenCL API(Application Programming Interface)에 대한 액세스를 제공하기 때문에, FPGA 상의 커널을 호출하여 결과 데이터를 다시 전달한다.
☞ OpenCL 표준에 대한 상세한 내용은 크로노스 그룹의 웹사이트를 참조하라(www.khronos.org/opencl/).
병렬 쓰레드가 각기 다른 코어 상에서 실행될 수 있는 CPU, GPU 등과 달리 FPGA는 상이한 전략을 제공할 수 있다. 커널 기능들을 파이프라인 병렬성 개념을 사용하여 본질적으로 멀티쓰레드인 전용 심층 파이프라인 하드웨어 회로로 전환할 수 있다. 이러한 각각의 파이프라인은 여러 차례 반복하여 단일 파이프라인을 통해 지원되는 것보다 한층 더 높은 병렬성을 제공할 수 있다. 그림 5에 나타낸 바와 같이 각 동작을 OpenCL 기술어로 실행하기 위해 기능 유닛들을 캐스케이딩하여 벡터 합 커널을 구현하고, 애플리케이션의 스루풋 및 레이턴시 요구사항을 충족시키기 위해 반복할 수 있다. 간단히 표시되었지만, 각 기능 유닛을 심층 파이프라인하여 최종 회로의 동작 주파수가 상당히 높게 나타날 수 있도록 보장할 수 있다. 또한, 컴파일러를 통해 외부 시스템과의 통신을 관리할 수 있는 회로를 개발할 수 있다. 이 예에서 DDRx 컨트롤러와 PHY를 커널에 연결하여 대형 오프-칩 어레이에 매우 효율적으로 액세스할 수 있도록 지원할 수 있다. 이와 마찬가지로 PCIe짋(PCI Express짋) IP가 자동적으로 구성되고 커널에 연결되기 때문에, x86 호스트가 OpenCL API를 통해 FPGA 액셀러레이터와 통신할 수 있다.
FPGA 상에서 OpenCL 표준 구현의 장점
OpenCL 기술어를 사용하여 FPGA를 위한 설계를 개발함으로써 HDL 설계에 기반한 전통적인 방법론에 비해 다양한 장점을 얻을 수 있다. 이러한 장점 중에서 가장 중요한 것을 그림 6에 나타냈다. 소프트웨어 프로그래머블 디바이스를 위한 개발 다음에는 아이디어 발상, C와 같은 하이-레벨 언어로 알고리즘 코딩, 자동 컴파일러를 이용하여 명령 스트림 개발 등의 플로가 일반적으로 이어진다.
이러한 접근법은 전통적인 FPGA-기반 설계 방법론과 대조적일 수 있다. 이때 알고리즘을 구현하는 데 사용되는 하드웨어의 사이클별 기술어를 개발하는 데 있어서 많은 부담이 설계자에게 부과된다. 그림 7에 나타낸 바와 같이 전통적인 플로는 데이터 경로 및 이들 데이터 경로를 제어하기 위한 상태 머신의 개발, 시스템 레벨 툴(예를 들어, SOPC Builder, Platform Studio)들을 사용하여 로우-레벨 IP 코어의 연결, 그리고 외부 인터페이스는 해결되어야만 하는 고정된 제한 요소들을 부과하기 때문에, 타이밍 클로저(timing closure) 문제의 처리 등을 포함하고 있다. OpenCL 컴파일러의 목표는 설계자를 위해 이러한 모든 단계를 자동으로 수행하는 것이며, 이를 통해 설계자가 지루한 세부 하드웨어 설계에 집중하기보다는 알고리즘을 정의하는 데 집중할 수 있다. OpenCL 컴파일러가 동일한 하이-레벨 기술어를 신형 FPGA를 활용하는 파이프라인으로 변형하기 때문에, 설계자는 이러한 방법으로 설계함으로써 보다 향상된 성능을 제공하는 새로운 FPGA로 간편하게 이동할 수 있다.
사례 연구: 몬테 카를로 블랙-숄즈 방법
금융 시장에서 가장 중요한 벤치마크 중 하나는 몬테 카를로 블랙 숄즈(Monte Carlo Black-Scholes) 방법을 통한 옵션 가격의 계산이다. 기법은 기본적인 주가에 대한 임의 시뮬레이션을 수행하여 수백만 개 이상의 각기 다른 경로에 대해 예상 수익의 평균을 구하는 것을 토대로 하고 있다. 이와 같은 시뮬레이션의 예를 그림 8에 그래픽으로 나타냈다.
이러한 연산을 수행하는 알고리즘의 하이-레벨 구조를 그림 9에 나타냈다. Mersenne Twister 난수 생성기가 균일하게 분산된 값들을 생성하는 데 최초로 사용됐다. 이 난수 시퀀스는 역 정규 누적 밀도 함수(Inverse Normal Cumulative Density Function)로 전달되어 정규 분포 시퀀스를 생성한다. 다음으로 이들 난수들은 GBM(Geometric Brownian Motion)을 이용하여 주가 변동을 시뮬레이션하는 데 사용된다. 각 시뮬레이션 경로의 마지막에 콜 옵션 수익이 기록되고, 수익에 대한 예상 값을 산출하기 위해 평균값을 구한다. 전체 알고리즘을 FPGA에서 CPU, GPU로 포팅할 수 있는 약 300개의 OpenCL 코드 라인으로 구현할 수 있다.
Altera갌PGA를 통해 개발된 OpenCL 프레임워크를 활용함으로써 표 1에 나타낸 바와 같이 탁월한 벤치마크 결과를 얻을 수 있었다. 유사한 GPU와 대조적으로 Stratix짋 IV FPGA EP4SGX530을 목표로 하는 OpenCL 프레임워크는 CPU와 GPU의 처리 성능 모두 초과했다. 처리성능 향상뿐만 아니라, FPGA 솔루션은 보수적인 추정치로도 동일한 코드를 실행할 때 비교 GPU에 비해 전력을 1/5 덜 소모했다. 이와 같은 속도와 전력 효율의 조합은 연산-집약적인 애플리케이션의 에너지 요구사항을 대폭 낮춘다. ES
<저작권자(c)스마트앤컴퍼니. 무단전재-재배포금지>