요즘 인기있는 Raspberry Pi 혹은 ODROID같은 임베디드 리눅스 타겟을 플랫폼으로 개발을 하는 경우 일반적으로 타겟에 모니터와 마우스, 키보드 따위를 연결하고 개발용 IDE를 설치하여 개발하게 된다. 최소한으로 VI만 가지고도 잘 개발하는 분들도 있지만 패키지 관리나 협업 등을 하려면 아무래도 이클립스 혹은 QT같은 IDE를 활용하는것이 편하다. 하지만 한정된 리소스로 인해 타겟에 모든걸 설치해서 개발하는건 꽤나 번거로운 작업이다. 특히 여러개의 기기를 동시에 테스트해야 하는경우에는 더욱 그러하다.

분명히 로컬 머신에서는 잘 동작하던 프로그램이 타겟에 올리면 안되는 경우가 많은데 대부분 로컬 머신의 아키텍쳐(대부분 인텔 x64)와 타겟의 아키텍쳐(ARM 32bit 혹은 ARM 64bit)가 다른데서 기인한다.


Jetson 보드 역시 암 기반CPU에 큐다 코어를 박아넣은 형태이기 때문에 마찬가지 문제가 발생한다. 다행히 엔비디아의 개발자들도 이러한 문제를 인식했는지 원격(Remote) 시스템에서 타겟의 프로그램을 개발할 수 있는 플랫폼을 만들어 놓았다. 이것은 비록 젯슨 보드가 로컬 머신의 아키텍쳐와 다르더라도 CUDA라고 하는 엔비디아 자체의 인터페이스를 제공하고 있기 때문인데 바로 이 CUDA Toolkit을 통해 여러 플랫폼에서 개발할 수 있는 환경을 구축해 놓았다.

자세한 소개는 여기에 있다. 

https://devblogs.nvidia.com/parallelforall/remote-application-development-nvidia-nsight-eclipse-edition/



Nsight Eclipse Edition은 이러한 원격 개발 모드: 크로스 컴파일과 "프로젝트 연동"모드를 제공한다. x86 호스트 시스템에서 ARM을 위한 크로스 컴파일을 하기 위해서는 모든 ARM 라이브러리들이 호스트 시스템에 존재하면서 어플리케이션이 마치 ARM 위에서 돌아가는 것처럼 꾸며야 한다. 


아래 과정은 젯슨 보드에 Jetpack 을 설치하는 과정에서 자동으로 수행하기 때문에 Jetpack을 설치했다면 바로 nSight을 실행하면 된다.

CUDA 툴킷 설정

큐다 툴킷은 Tx2 혹은 Tx1을 설치하는 과정에서 자동으로 설치된다. 

만약 다른 PC에서 설치만 하고 별도로 설치하는 경우는 CUDA Installation Guide. 를 따라서 하면 된다.

큐다에서 지원하는 크로스 컴파일 환경은 다음과 같다.

  • x86_64: 64-bit x86 CPU architecture;
  • armhf: 32-bit ARM CPU architecture, as found on Jetson TK1;
  • aarch64: 64-bit ARM CPU architecture, found on Jetson TX1 and TX2 and certain Android systems;
  • ppc64le: 64-bit little-endian IBM POWER8 architecture

1. armhf, arm64(aarch64) 혹은 ppc64le의 크로스컴파일 환경을 허용하기 위해 다음을 수행한다.

# For Jetson TX1/TX2: 
$ sudo dpkg --add-architecture arm64
$ sudo apt-get update

# For Jetson TK1: $ sudo dpkg --add-architecture arm64
$ sudo dpkg --add-architecture armhf
$ sudo apt-get update

2. dpkg를 실행하여 repo 메타 데이터를 설치하고 업데이트

Jetson tx1/tx2는 CUDA 8을 사용

$ sudo dpkg -i cuda-repo-ubuntu1404-8-0-local-ga2_8.0.61-1_amd64.deb

$ sudo apt-get update

다음을 수행하여 Cuda 툴킷을 설치한다. 이 글을 작성하는 현재 버전 9.0까지 나와있으나 Jetson보드는 8까지만 지원한다. 


$ sudo apt-get install cuda-toolkit-8.0

Nsight 프로젝트 만들기
이제 nsight 개발 IDE를 실행하여 원격 프로그래밍 환경을 만들어보자.


새로운 프로젝트를 만든다. 일단 간단한 프로그램을 작성하기 위해 C++프로젝트를 선택한다.


프로젝트 이름을 선택하고 툴체인으로 CUDA Toolkit 8.0을 선택한다.

    


프로젝트에 src라는 소스 폴더를 추가하고 여기에 main.cpp 소스파일을 추가한다.


    



main.cpp파일에 다음 코드를 추가하여 빌드해본다.

#include <iostream>

#include <stdio.h>


int main(void)

{

printf("Hello World!\n");

return 0;

}


정상적으로 빌드 되면 성공이다.

이제 로컬 머신에서 빌드한 프로젝트를 타겟에 연결한다.

Project -> Properties 패널에서 Target Systems 를 선택하면 새로운 타겟을 추가할 수 있다.

기존에 추가한적이 있다면 자동으로 설정되어 있는데 만약 아무것도 없으면 Manage.. 를 눌러 직접 추가한다.

여기에서는 타겟에 할당된 IP가 10.0.0.102 로 되어있다.



프로젝트 Path가 타겟의 폴더로 선택된다. CPU 아키텍쳐가 AArch64로 설정된 것을 볼 수 있다. 이것은 젯슨 보드에 설치된 리눅스 버전을 따른다. 

만약 32비트 버전을 설치하였을 경우 ARM 으로 설정하면 된다.


이제 빌드 설정을 타겟으로 설정한다. 

상단 메뉴에서 Project --> Build Configrations --> Set Active 에서 앞서 설정한 타겟을 선택한다.



이제 빌드하면 로컬이 아닌 타겟에서 빌드가 이루어진다.
혹시 오류가 발생하는 경우 빌드를 Clean 하고 다시 빌드해본다.
그러면 타겟의 프로젝트 폴더 아래 Debug 폴더에 실행파일이 생성된 것을 확인할 수 있다.

타겟 TX2 보드에 만들어진 실행파일


타겟 보드에서 실행한 결과




+ Recent posts