대메뉴 바로가기 본문 바로가기

데이터 기술 자료

데이터 기술 자료 상세보기
제목 임베디드 시스템을 위한 모바일 수퍼컴퓨터 : 엔비디아 젯슨 TK1과 쿠다
등록일 조회수 6385
첨부파일  

임베디드 시스템을 위한 모바일 수퍼컴퓨터

엔비디아 젯슨 TK1과 쿠다



엔비디아의 젯슨(Jetson) TK1은 아두이노나 라즈베리 파이와 유사한 소형 임베디드 보드임에도 실시간 이미지, 데이터 처리 능력을 갖췄다. 자동차, 로봇, 의료, 항공 등 시장에서 활용이 기대되고 있다. 그러한 젯슨 TK1 임베디드 보드로 CUDA(Compute Unified Device Architecture)와 OpenCV로 GPGPU를 함께 활용해 보자.



2014년 7월 23일 엔비디아는 임베디드 보드 ‘젯슨(Jetson) TK1’을 내놨다. TK1의 두뇌는 케플러(Kepler) 아키텍처 기반의 테그라 K1(192개 GPU 코어)다. ARM 코어텍스 A15에 기반의 이 쿼드코어는 일반적으로 GPU는 CPU보다 2차원이나 3차원 행렬연산처리에 최적화돼 있어 3D 그래픽은 물론 유전자 분석, 지질 공학 등을 보다 효율적으로 연산할 수 있다. 이를 가능케 한 것은 GPGPU 프로그래밍 언어인 쿠다(CUDA)와 OpenCL다. 이러한 병렬컴퓨팅 프레임워크를 통해 CPU와 GPU 등의 다양한 이기종 프로세서를 이용 가능한데, OpenCL은 OpenGL과 같은 개방형 표준, 쿠다는 엔비디아의 독자적인 GPGPU 프로그래밍 언어다.



3D 그래픽과 GPU

최초의 PC용 그래픽카드는 1981년 IBM이 개발한 MDA (Monochrome Display Adaptor)로, 80열×25줄의 문자 출력이 가능했다. 지원 색상은 녹색과 검정색 단 두 가지였다. 같은 해에는 640×200 해상도, 16 색상을 지원하는 CGA가 등장했다. 1987년에는 640×480 해상도에 256 색상 처리가 가능한 VGA가, 1989년에는 1024×768 해상도, 256 색상을 지원하는 SVGA가 등장하면서 본격적인 컴퓨터 그래픽 시대가 열렸다.





● 그래픽카드의 발달
초기 그래픽카드는 2D 그래픽 처리만 가능했다. 1990년대 중반까지만 하더라도 3D 처리를 지원하지 않았을 뿐더러 OpenGL의 까다로운 라이선스 때문에 OpenGL 드라이버도 제공하지 않았다. 1990년 중후반 S3의 ViRGE, 3dfx의 부두(Voodoo)가 등장한 이후 ATI의 Rage3D, 엔비디아의 NV3가 나오면서 PC에서도 3D 시대가 열렸다.

3D 그래픽 시장을 두고 3dfx, ATI, 엔비디아, S3, 3Dlabs 등의 기업은 치열한 기술 경쟁을 펼쳤다. 2000년 엔비디아가 3dfx를 인수하면서 고성능 3D 그래픽 시장을 엔비디아와 ATI가 양분하게 된다. 이후 ATI는 2006년 AMD에 합병됐고, 인텔은 독자 노선을 가고 있다. 이러한 3D 기술 경쟁은 GPU의 비약적인 발전을 가져왔다. 하나의 CPU가 여러 개의 코어로 구성됐듯 GPU도 2006년 출시된 테슬라 구조의 지포스8 시리즈부터 병렬처리가 본격화됐다.

● 컴퓨터 그래픽과 3D의 발달
1963년 튜링상을 수상한 이반 에드워드 서덜랜드(Ivan Edward Sutherland)가 발명한 스케치패드(Sketchpad)는 펀치카드나 컴퓨터 키보드를 통해 입력하는 방식에서 일보 진화한 입력 방식을 선보였다. 스케치패드는 9인치 CRT 모니터와 라이트펜으로 구성돼 프로그래머뿐만 아니라 디자이너들도 컴퓨터로 작업할 수 있었다.



1972년 현 픽사의 사장인 에드윈 캣멀(Edwin Catmull)과 프레드 파크는 손 모양의 프레임을 이용해 최초의 3D 컴퓨터 그래픽을 만들어냈다. 손 모양으로 점을 이어 와이어를 만든 후 폴리곤을 입혀 입체감이 있는 손을 3D로 구현한 것이다. 에드윈 캣멀(Edwin Catmull)은 3D 컴퓨터 그래픽에서 많이 사용되는 Z 버퍼링, 텍스처 매핑, B 스플라인을 고안해냈다.





1980년대에는 광원이 있는 3D 그래픽을 렌더링할 수 있는 레이트래이싱(Ray Tracing) 기술이 개발됐다. 지금도 널리 사용되는 대표적인 캐드 프로그램인 오토캐드는 1982년 버전 1.0이 발표됐다. 이처럼 1980년대까지는 3D 기술이 일반적으로 널리 쓰이지 못했다. 특정 분야에서만 사용되는 정도에 머물렀다.





1992년 이디 소프트웨어(id Software)의 존 카맥(John Carmack)이 울펜스타인 3D를 내놓으면서 3D 게임 시대가 태동하기 시작한다. 그로부터 1년 후 둠(Doom)이 출시되면서 본격적인 3D 게임 시대가 열렸다. 완전한 3D 게임은 1996년 발매된 퀘이크로 알려져 있는데, OpenGL로 3D 게임을 구현했었다.

그 무렵 3D 그래픽 API로는 OpenGL과 다이렉트3D가 있다. 다이렉트3D는 마이크로소프트의 윈도우에서만 지원되던 3D 기술로, 초창기에는 OpenGL보다 성능이 떨어진다는 평가를 받았다. OpenGL은 실리콘그래픽스(SGI)의 유닉스 OS인 이리스(Iris)를 위한 3차원 그래픽 엔진인 IrisGL을 오픈소스화 한 3D API로 1992년 발표됐다. 당시 OpenGL은 워크스테이션에서만 사용 가능해 PC에서 사용되리라 아무도 예견하지 못했지만, 존 카맥은 OpenGL의 일 부분을 모아 퀘이크라는 게임을 만들고 관련 소스 코드를 모두 공개했다.

● 병렬처리와 OpenCL, 그리고 쿠다
OpenGL이 한창 발전하던 2000년대 초 셰이딩 언어가 등장했다. 셰이딩 언어는 OpenGL 1.4에 처음 등장하고 2.0에 이르러 본격적으로 지원됐다. 2003년 출시된 지포스3 시리즈부터 셰이딩 언어가 게임에서도 쓰이기 시작했다. 범용 연산을 목적으로 한 CPU는 여러 연산 처리가 가능하나 GPU는 2D나 3D 그래픽과 같은 특수한 연산에 최적화됐다. CPU는 직렬 처리에 최적화된 코어로 구성되는 반면, GPU는 병렬처리를 위해 설계된 수천 개의 보다 작은 코어를 가지고 있다. GPU는 반복적이고 단순한 대량의 연산을 병렬로 나눠 실행하기 때문에 CPU보다 속도가 빠르다.



병렬처리가 가능한 연산 집약적인 부분을 GPU가, 나머지 코드를 CPU로 처리하면 애플리케이션을 보다 빨리 실행할 수 있다. GPU는 셰이더를 이용한 행렬 연산이 많은 연구 분야에서 쓰이곤 했지만, 셰이딩 언어는 그래픽 처리에 초점을 맞추다보니 범용적으로 쓰기에는 제약이 많았다. 이러한 GPU를 병렬처리에 활용하기 위한 시작은 애플에 의해 시작됐다. 바로 OpenCL이 그것이었다. OpenCL은 CPU, GPU, DSP 등의 다양한 처리 장치를 이용해 병렬로 처리할 수 있는 개방형 범용 병렬 컴퓨팅 프레임워크로, 2008년 11월 18일 크로노스 그룹에 의해 OpenCL 1.0이 발표됐다. 이 무렵 GPU 제조사들도 독자 기술 개발에 나섰다. AMD는 Close to Metal이라는 기술을, 엔비디아는 CUDA를 개발했다. 차후 AMD는 독자 기술 개발을 포기하고 OpenCL을 지원하는 쪽으로 방향을 선회한다.

쿠다는 엔비디아 GPU 전용 기술로 지포스8 시리즈 이상, 쿼드로, 테슬라 등의 제품군에서 사용 가능하다. 쿠다는 유전자 알고리즘 분석, 지리 정보 시스템(GIS : Geographic information system), 천문학, 암호학, 수학, 회계 등의 분야에서 쓰이고 있다. 쿠다는 C 언어 기반으로, 엔비디아의 별도 컴파일러에 의해 빌드된다. 쿠다 SDK는 2007년 2월 15일 공개됐다. 윈도우XP 이상, 레드햇 엔터프라이즈 리눅스 3.x 이상, 맥OS X 10.5 이상을 지원한다. 쿠다를 이용하기 위해서는 개발환경을 다운로드하고 설치해야 된다. 쿠다를 설치하려면 엔비디아의 그래픽카드가 필요한데, 설치 과정은 매우 쉽다. 쿠다 개발 환경이 올바르게 설치됐는지 확인하려면 nvcc -version이나 nvcc -V 명령어를 입력하면 된다(<그림 5> 참조).





엔비디아 젯슨 TK1과 개발 환경

2014년 2월 MWC(Mobile World Congress) 2014에서 엔비디아는 테그라 K1이라는 ARM 아키텍처 기반의 모바일 그래픽 프로세서를 발표했다.





● 테그라 K1과 짓슨 TK1
테그라 K1의 케플러 아키텍처는 성능과 효율성을 극대화한 SMX(Streaming Multiprocessor) 설계와 효율적인 병렬처리를 위한 동적 벙렬 처리(Dynamic Parallelism), GPU의 여러 코어들을 보다 효율적으로 사용하기 위한 Hyper-Q 등의 기술을 지원한다. 병렬처리에 특화된 모바일 애플리케이션이다보니 32와 64비트를 모두 지원한다. 기본적인 CPU 성능은 퀄컴 스냅드래곤800, 애플 A6, 삼성전자 엑시노스5 수준이다. 그러나 GPU의 경우 다이렉트X 11 OpenGL 4.4, 테셀레이션(Tessellaion) 등 PC용 기술까지 지원해 모바일에서 보다 향상된 3D 그래픽을 구현할 수 있다. 2014년 3월 25일에는 192개의 쿠다 코어를 탑재한 테그라 K1 기반의 모바일 수퍼컴퓨터 플랫폼이 등장한다. 바로 젯슨 TK1이다. TK1은 쿠다 6.0뿐 아니라 OpenGL 4.4, OpenGL ES 3.1은 물론 가속화된 OpenCV(OpenCV4Tegra)도 지원한다. TK1의 타겟은 로봇, 자동차 등의 산업 현장이다.











● 젯슨 TK1의 스펙과 설치
젯슨 TK1은 우분투 기반의 리눅스를 지원한다. HDMI 커넥터뿐 아니라 USB3.0 등 데스크톱과 유사한 확장성을 제공한다.





젯슨 TK1을 사용하기 위해서는 키보드, 마우스, HDMI를 지원하나 모니터나 TV가 필요하다. USB 단자가 1개 밖에 없기 때문에 키보드와 마우스를 함께 사용하기 위해서는 별도의 USB 허브가 필요하다. 인터넷은 TK1의 유선랜을 이용하거나 별도의 USB형 무선랜 카드를 설치해 이용할 수 있다. 주의할 점은 TK1이 지원하는 무선랜 카드가 많지 않다는 점이다. 구입에 앞서 반드시 http://elinux.org/Jetson/Network_Adapters에서 호환 여부를 체크하자.

● 젯슨 TK1의 루트 파일 시스템과 개발 환경
젯슨 TK1에는 우분투 14.04 기반의 Linux4Tegra(L4T)가 기본 설치돼 있다. 만약 초기 버전의 루트 파일 시스템이 설치돼 있는 경우 최신 버전으로 업데이트를 하자. 최신 루트 파일 시스템은 https://developer.nvidia.com/linux-tegra에서 다운로드할 수 있다. 만약 업데이트 후 부팅이 되지 않을 때에는 리커버리 모드로 복구를 시도하면 된다. 리커버리 모드로 진입하기 위해서는 우분투가 설치된 별도의 PC가 필요하다. TK1의 마이크로 USB 단자와 우분투가 설치된 PC를 연결하고, 젯슨 TK1의 ‘Force Recovery’ 버튼을 누른 상태에서 전원을 켜자. 리커버리 모드에 진입되면 PC의 리눅스에서 lsusb 명령어를 입력하자. <그림 10>처럼 ID가 0955:7140인 장비가 연결됐음을 확인할 수 있다.



이제 리눅스가 설치된 PC에서 루트 파일 시스템의 설치 파일을 다운로드하자. 이 파일은 엔비디아 웹사이트에서 다운로드하거나 wget 명령어로 받으면 된다(<리스트 1> 참조).



<리스트 1> wget 명령어로 젯슨 TK1 루트 파일 시스템 다운로드 ~ $ wget http://developer.download.nvidia.com/devzone/devcenter/mobile/files/L4T /jetpack_tk1_1.2/02/JetPackTK1-1.2-cuda6.5-linux-x64.run --2015-07-19 17:58:09-- http://developer.download.nvidia.com/devzone/devcenter/mobile /files/L4T/jetpack_tk1_1.2/02/JetPackTK1-1.2-cuda6.5-linux-x64.run Resolving developer.download.nvidia.com (developer.download.nvidia.com)... 1 73.223.227.27, 173.223.227.56 Connecting to developer.download.nvidia.com (developer.download.nvidia.com) |173.223.227.27|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 15096201 (14M) [application/octet-stream] Saving to: `JetPackTK1-1.2-cuda6.5-linux-x64.run' 100%[======================================>] 15,096,201 1.26M/s in 12s 2015-07-19 17:58:21 (1.18 MB/s) - `JetPackTK1-1.2-cuda6.5-linux-x64.run' saved [15096201/15096201] c ~ $ chmod a+x JetPackTK1-1.2-cuda6.5-linux-x64.run ~ $ ./JetPackTK1-1.2-cuda6.5-linux-x64.run



다운로드된 이미지는 X 윈도우에서 실행하면 된다. JetPackTK1은 GUI 환경에서 마법사 형태로 설치하면 되는데, 라이선스 동의하고 다음(Next)를 클릭하자. 다음 설치 디렉터리를 지정한 다음 설치 옵션을 선택하자.





설치 옵션은 세 가지인데, 기본값은 Express(CUDA와 OpenCV)다. 커스텀(Custom)을 선택하면 모든 옵션을 볼 수 있다. 실제 설치에 앞서 선택한 옵션을 보여준다.





이제 네트워크를 설치할 차례다. 네트워크에 프락시(Proxy)가 있을 경우 관련 옵션을 설정해야 한다. 컴포넌트 다운로드에서는 루트 파일 시스템과 쿠다 개발 환경, 문서 등을 다운로드할 수 있다.



다음으로 할 일은 젯슨 TK1에 설치할 루트 파일 시스템을 만드는 것이다. 루트 파일 시스템을 만들 때 우분투 비밀번호와 라이선스 동의, 컴포넌트가 설치될 디렉터리 등을 물어보는데 차근차근 입력하자. 그러면 루트 파일 시스템이 생성되고 젯슨 TK1에 설치가 진행된다. 이 작업에는 십분 이상이 소요되는데 완료되면 TK1이 재부팅된다. 참고로 우분투의 기본 계정은 ubuntu고, 비밀번호도 ubuntu다.

젯슨 TK1에 로그인한 다음 가장 먼저 할 일은 IP 주소와 DNS 설정을 확인하는 것이다. IP 주소는 터미널을 실행시키고 ifconfig 명령어를 입력하면 알 수 있다. 우분투에서 터미널의 경우 [Ctrl+ Alt+T]를 누르거나 윈도우 키를 누른 후 Terminal을 입력하면 실행된다. DNS 설정 확인은 시스템 설정에서 네트워크를 선택하면 된다.



네트워크 화면의 왼쪽 패널에는 Wired가 있다. 클릭한 다음 하단의 [Options...] 버튼을 선택하자. Wired 연결 설정이 가능한 창이 열리는데, 여기서 IPv4 Settings 탭을 클릭한다. DHCP를 사용하는 경우 DNS 서버 주소가 자동으로 설정된다. 만약 그렇지 않을 경우 Method에서 [Automatic (DHCP) addresses only]를 선택하고 하단의 DNS Servers에 DNS 주소를 설정하면 된다.





네트워크 설정을 마쳤다면 쿠다 개발 환경 설치를 위한 준비 작업을 할 차례다. <리스트 2>를 실행하면 쿠다 개발 환경이 /usr/local/cuda-6.5에 설치된다. 설치가 완료되면 쉘의 환경 파일(.bashrc)에 관련 내용이 설정된다.



<리스트 2> 쿠다 설치 ubuntu@tegra-ubuntu:~$ wget http://developer.download.nvidia.com/devzone/devcenter/mobile /jetpack_tk1/007/linux-x64/cuda-repo-l4t-r21.3-6-5-local_6.5-50_armhf.deb /* ~ 중간 생략 ~ */ 2015-07-20 03:35:54 (1.62 MB/s) - ‘cuda-repo-l4t-r21.3-6-5-local_6.5-50_armhf.deb’ saved [568399644/568399644] ubuntu@tegra-ubuntu:~$ sudo dpkg -i cuda-repo-l4t-r21.3-6-5-local_6.5-50_armhf.deb Selecting previously unselected package cuda-repo-l4t-r21.3-6-5-local. /* ~ 중간 생략 ~ */ OK ubuntu@tegra-ubuntu:~$ sudo apt-get update /* ~ 중간 생략 ~ */ Reading package lists... Done ubuntu@tegra-ubuntu:~$ sudo apt-get install cuda-toolkit-6-5 Reading package lists... Done /* ~ 중간 생략 ~ */ Processing triggers for libc-bin (2.19-0ubuntu6.3) ... ubuntu@tegra-ubuntu:~$ cat ~/.bashrc | tail /* ~ 중간 생략 ~ */ export PATH=/usr/local/cuda-6.5/bin:/usr/local/sbin:/usr/local/bin: /usr/sbin:/usr/bin:/sbin:/binexport LD_LIBRARY_PATH=/usr/local/cuda-6.5/lib: export PATH=/usr/local/cuda-/bin:/usr/local/cuda-6.5/bin:/usr/local/sbin:/ usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin export LD_LIBRARY_PATH=/usr/local/cuda-/lib:/usr/local/cuda-6.5/lib:



다시 PC로 돌아와 설치 작업을 마무리하자. 젯슨 TK1의 IP 주소를 입력하고 계정과 비밀번호를 입력한다. 앞서 설명했듯 기본 계정과 비밀번호 모두 ubuntu다. 그러면 컴포넌트 설치 창이 뜨는데 다음 버튼을 누르면 쿠다 관련 SDK가 설치된다. 이로써 젯슨 TK1에서 쿠다 개발을 위한 환경 구축이 완료됐다.

● 쿠다와 OpenGL 샘플
쿠다의 기본 샘플 코드는 엔비디아 웹사이트(https://developer.nvidia.com/cuda-code-samples)에서 다운로드할 수 있다. 이 샘플 코드들은 젯슨 TK1 개발 환경에 설치하면 실행해 볼 수 있다. 참고로 TK1과 관련된 쿠다와 OpenGL 관련 샘플은 /home/ubuntu/NVIDIA_CUDA-6.5_Samples/bin/armv7l/linux/release/gnueabihf 디렉터리와 /home/ubuntu/Game WorksOpenGLSamples/samples/bin/linux-arm32 디렉터리에서 찾고 실행할 수 있다.







<리스트 3> /home/ubuntu/NVIDIA_CUDA-6.5_Samples 하위 디렉터리의 샘플 빌드하기 ubuntu@tegra-ubuntu:~$ cuda-install-samples-6.5.sh /home/ubuntu/ ubuntu@tegra-ubuntu:~$ cd NVIDIA_CUDA-6.0_Samples ubuntu@tegra-ubuntu:~/NVIDIA_CUDA-6.0_Samples$ make ubuntu@tegra-ubuntu:~/NVIDIA_CUDA-6.0_Samples$ cd / home/ubuntu/NVIDIA_CUDA-6.5_Samples/ bin/armv7l/linux/release/gnueabihf /* ~ 중간 생략 ~ */



/home/ubuntu/NVIDIA_CUDA-6.5_Samples 디렉터리 하위에는 또 다른 디렉터리들이 있다. 이곳에도 쿠다와 OpenGL 관련 샘플들이 있다. /home/ubuntu/NVIDIA_CUDA-6.5_Samples 하위 디렉터리의 샘플을 실행하려면, <리스트 3>처럼 샘플을 홈디렉터리로 설치한 후 빌드하면 된다.



출처 : 마이크로소프트웨어 8월호

제공 : 데이터 전문가 지식포털 DBguide.net