Arm의 ComputeLibrary인 ArmCL 크로스 빌드 및 통합 과정
포스트
취소

Arm의 ComputeLibrary인 ArmCL 크로스 빌드 및 통합 과정

개요

2022년 11월에 발표한 “단일 ISA 이기종 멀티 코어 구조를 위한 프로파일 기반 ArmCL 최적 스케줄 탐색” 학술지를 진행하면서 겪었던 내용을 정리 및 ArmCL 개발 관련 일정을 정리하였다. 우선적으로 ArmCL은 라이브러리 형식만 지원 하므로 기기에서 테스트를 하기 위해선 실행파일로 구현해야한다. 이 과정에서 ArmCL을 커스텀하고 빌드하기 위한 과정이다. 빌드가 어려운 이유는 크로스 빌드 경험, C++ 개발 경험이 부족하다면 개발 환경을 구축에 많은 시간을 투자가 필요하기 때문이다. 그래서 최대한 쉽게 설명하기 위해 작성하게 되었다.

설명

ArmCL에 대해 설명하기 앞서 필요한 전제 조건을 나열한다. 우선 크로스 컴파일이란 완전히 별개의 2개의 시스템이 있을 때, 다른 1개의 시스템에서 컴파일 한 결과가 다른 시스템에서 동작하는 것이다. 예시로 Arm환경의 MacOS에서 X86환경의 Windows를 위한 프로그램을 빌드하는 것이 크로스 컴파일이다.

그래서 빌드가 가능한 운영체제와, 실행 가능한 환경이 나눠지는것이다. 또한 ArmCLCPU, GPU 가속화를 지원하지만, 내부적으로 호환성을 위해 #ifdef 형식으로 운영체제별 구현이 되어 있습니다.

arm architecture 출처 : Build Arm NN custom backend plugins

ArmCL은 위의 그림처럼 볼 때, NEON과 CL을 가지고 있다는 형식으로 표현이 되어 있다. NEON은 Arm CPU의 SIMD(Single Instruction Multi Data, 즉 1회 명령어로 여러개의 데이터를 처리하는 기술이다.) 기술 명이며이다. 실제로 코드를 분석하게 된다면 NEON을 랩핑하여 만든 구현체와 OpenCL을 랩핑하여 제공되는 버전 총 2가지가 존재한다. 그래서 OpenCL을 통해 실행한다면, 실행은 어떠한 환경에서든지 동작을 지원한다. 그러나 특정 CPU의 특성을 타는 NEON의 경우 동작하지 않는다.

빌드 관련 운영체제

    • X86 Linux, Arm64 Linux 와 같은 리눅스 계열은 모두 지원한다.
    • 놀랍게도 Windows 또한 지원 한다.
    • MacOS는 지원하지 않습니다. 그래서 Docker를 이용한 가상화를 통해 실행해야 합니다.

빌드에 필요한 도구

  1. GCC 계열의 빌드 도구
  2. scons (ArmCL의 빌드 도구, CMAKE와 기능적 동일함.)
  3. g++-arm-linux-gnueabi g++-arm-linux-gnueabihf crossbuild-essential-arm64 crossbuild-essential-armhf (빌드를 위한 필수 도구)

도커를 통한 빌드 설명

도커를 통해 만약 빠른 빌드를 원한다면 아래의 명령어를 수행함으로써 해결 할 수 있습니다. 이때 빌드된 결과물은 ArmCL 22.05 버전이므로 아래의 git checkout tags/v22.05를 수정함으로써 변경할 수 있을것 이라 생각합니다. 솔직한 감상으로는 docker 빌드 결과물을 제공함으로써, 쉽게 접근 할 수 있습니다.

docker run --rm -it -v $pwd:/build armcl bash

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
FROM ubuntu:20.04 AS builder

ENV DEBIAN_FRONTEND=noninteractive \
    TZ=Etc/UTC
    
RUN apt update && DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC apt -y install locales tzdata

RUN apt install -y \
    scons \
    g++-arm-linux-gnueabi \
    g++-arm-linux-gnueabihf \
    git \
    crossbuild-essential-arm64 \
    crossbuild-essential-armhf

ENV BUILD_CORE=16 \
    BUILD_DEBUG=1 \
    BUILD_NEON=1 \
    BUILD_OPENCL=1 \
    BUILD_EXAMPLE=1 \
    BUILD_ARCHITECTURE=arm64-v8a

RUN git clone "https://github.com/Arm-software/ComputeLibrary" && \
    cd /ComputeLibrary && \ 
    git checkout tags/v22.05 && \
    scons Werror=1 debug=${BUILD_DEBUG} asserts=0 \
          neon=${BUILD_NEON} opencl=${BUILD_OPENCL} \
          examples=${BUILD_EXAMPLE} \
          arch=${BUILD_ARCHITECTURE} -j${BUILD_CORE} && \
    mkdir /build && \
    mv /ComputeLibrary/build / && \ 
    rm -rf /ComputeLibrary && \
    rm -rf /build/*.a && \
    rm -rf /build/src /build/tests

ENV LD_LIBRARY_PATH=/build

개발 환경 구축

도커를 통해 ArmCL을 빌드에 성공하였다면, 아래의 명령어를 수행하여 CMAKE로 바로 개발이 가능한 프로젝트를 사용할 수 있다. ArmCL의 빌드된 파일을 external에 넣어주는것으로 ArmCL을 개발할 환경 구성이 끝난것이다. 만약 크로스 컴파일을 해야한다면, g++이 아닌 aarch64-linux-gnu-g++ 로 변경하면 바로 사용이 가능하다. 만약 일부 커널 버전이 낮아, gcc 7버전이나, 그 이하 버전이 필요한 경우 마찬가지로 아래의 다운로드링크로 나타낸다.

aarch64-linux-gnu-g++의 7.5.0 버전 다운로드 wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz 템플릿 구성 git clone https://github.com/Piorosen/ArmCL-CMake-Template

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

원격 데스크톱 노트북 개발- 문서편

NDK를 이용한 독립 실행이 가능한 C++ 웹 서버 개발