JETSON TK1

JETSON TK1
7/16/2014
JETSON TK1
世界初の組み込みスーパーコンピューター
Tegra K1 開発キット
CUDA
VisionWorks
完結した開発ツールスイート
5 Watts
x
12
x
x
5
1,640,000
Getting Connected
1つ以上の繋げ方:
Traditional display, keyboard, and mouse
Over the network like SSH, VNC, web browser
Gigabit Ethernet ポート
Network is DHCP by default
Wi-Fi は追加アダプターで有効化
PCIe-based or
USB-based
デフォルトのユーザネーム: ubuntu
デフォルトのパスワード: ubuntu
Task #0: Power on Jetson TK1
Goal: Jetson TK1 の電源をいれてデスクトップを表示する。
Terminal(端末)を起動する。
Task:
電源アダプタを Jetson TK1 に接続して初回起動します
電源ボタンはボード上にあります:
日本語キーボード用に変更:
setxkbmap –layout jp
CUDA Parallel Computing Platform
www.nvidia.com/getcuda
Programming
Approaches
Libraries
Directives
Programming
Languages
“Drop-in” Acceleration
Easily Accelerate Apps
Maximum Flexibility
Development
Environment
Nsight IDE
Linux, Mac and Windows
GPU Debugging and Profiling
Open Compiler
Tool Chain
Hardware
Capabilities
CUDA-GDB debugger
NVIDIA Visual Profiler
Enables compiling new languages to CUDA platform, and
CUDA languages to other architectures
SMX
Dynamic Parallelism
HyperQ
GPUDirect
Task #1: Write Simple CUDA C Program
Goal: CUDA版の “Hello World”
プログラムを書く
Task:
CTRL+ALT+T で端末を起動
以下を実行:
gedit hello.cu &⏎
右記のコードを入力
ファイルを保存してコンパイル
nvcc –o hello hello.cu⏎
実行する
./hello⏎
#include <stdio.h>
__global__ void hello() {
printf(“Hello from %d.%d\n”,
blockIdx.x, threadIdx.x);
}
int main() {
hello<<<2,2>>>();
cudaDeviceSynchronize();
return 0;
}
Task #1 – 結果例
$ ./hello
Hello from
Hello from
Hello from
Hello from
0.1
1.1
1.0
0.0
これらは並列で実行されているように行の順序は変更になる場合があります
CUDA Samples
NVIDIA’s CUDA Toolkit には有用なサンプルコー
ドが含まれています
GPUをフル活用するための方法
コンピュートとグラフィックスの組み合わせ方
デバイスのクエリー方法
等々…
本セッションで利用する Jetson TK1 には既に
CUDA 6 がインストールされています
Task #2: Compile & Run CUDA Samples
Goal: いくつかのCUDAサンプルをコンパイルして実行する
Task:
サンプルをコピー (実行は一度のみ):
cuda-install-samples-6.0.sh .⏎
smokeParticlesを試す:
cd NVIDIA_CUDA-6.0_Samples/5_Simulations/smokeParticles/⏎
make⏎
../../bin/armv7l/linux/release/gnueabihf/smokeParticles⏎
他のサンプルも試してみましょう
NVIDIA_CUDA-6.0_Samples/1_Utilities/deviceQuery/⏎
Task #2 – 結果例
OpenCV
Introduction
コンピュータビジョン、画像処理、機械学習用のオープンソース・ライブラリ
使いやすいBSD ライセンス
自由に使える (www.opencv.org)
Portability
リアルタイム・コンピュータビジョン (x86 MMX/SSE, ARM NEON, CUDA)
C (11 years), now C++ (3 years since v2.0), Python and Java
Windows, OS X, Linux, Android and iOS
Usage
利用実績:
600万以上のダウンロード, 47,000 以上のユーザーグループ
Google, Yahoo, Microsoft, Intel, IBM, Sony, Honda, Toyota
Applications:
Street view image stitching
Automated inspection and surveillance
Robot and driver-less car navigation and control
Medical image analysis
Video/image search and retrieval
Movies - 3D structure from motion
Interactive art installations
Functionality
Desktop
x86 single-core (Intel started, now Itseez.com) - v2.4.5 >2500 functions (multiple algorithm
options, data types)
CUDA GPU (Nvidia) - 250 functions (5x – 100x speed-up)
http://docs.opencv.org/modules/gpu/doc/gpu.html
OpenCL GPU (3rd parties) - 100 functions (launch times ~7x slower than CUDA*)
Mobile (Nvidia):
Android (not optimized)
Tegra – 50 functions NEON, GLSL, multi-core (1.6 – 32x speed-up)
*Shengen Yan, AMD Fusion Developer Summit 2012.
OpenCV Basics
異なる機能のために複数のモジュール
モジュールごとにヘッダーとライブラリーのインクルードが必要
一般には core と highgui モジュールを使う
名前空間
関数/オブジェクト名の衝突を避けるため、cv 名前空間を使用する:
using namespace cv;
Mat オブジェクト
CPU上のビデオの画像やフレームの情報/データを保持
MOG2
混合ガウスモデルベースの前景・背景分離アルゴリズム
Task #3: Compile & Run OpenCV Sample
Goal: OpenCV サンプルをコンパイルし実行する
Task:
cd ~/opencv-2.4.9/samples/c⏎ でディレクトリ移動
コンパイル:
g++ adaptiveskindetector.cpp -lopencv_highgui -lopencv_core lopencv_contrib⏎
実行
./a.out --camera=0⏎
USBカメラで動作を確認する
OpenCV + GPU
GPU モジュール
#include “opencv2/gpu/gpu.hpp”
-lopencv_gpu
名前空間:
using namespace cv::gpu;
GpuMat オブジェクト
Matに類似、ただGPU上の画像・フレームの保持用
GPUに画像を転送するには:
Mat h_image; // CPU image
GpuMat d_image; // GPU image
d_image.upload( h_image );
GPUから画像をダウンロードするには:
d_image.download( h_image );
OpenCV + GPU
CPU上でMOG2モジュールを使う場合
#include "opencv2/video/background_segm.hpp"
BackgroundSubtractorMOG2 mog2;
GPU上でMOG2モジュールを使う場合
#include "opencv2/gpu/gpu.hpp"
MOG2_GPU mog2;
Task #4: Port CPU app to GPU
Goal: 計算量の多い部分についてOpenCVがGPUを利用するようにする
Task:
ディレクトリの変更:
cd ~/lab/bgfg⏎
CPU版のコンパイル:
make cpu⏎
./bgfg_segm_cpu –c 0⏎
cp bgfg_segm_cpu.cpp bgfg_segm_gpu.cpp⏎
実行して結果を確認:
CPU版からコピー:
コピーしたファイルにGPU対応を追加
GPU版をコンパイル:
実行して性能を確認:
ビデオファイルを使う場合:
make gpu⏎
./bgfg_segm_gpu –c 0⏎
./bgfg_segm_gpu⏎
回答はこちら bgfg_segm_solution.cpp
Task #4 – 結果例
Solution source code is available at
https://github.com/mebersole/TrainingMaterials/blob/master/Jets
onTK1/bgfg/bgfg_segm_gpu.cpp
OpenCV on the GPU
今回の BGFG サンプルの場合:
ARM CPU の約4倍早く実行された
16% 少ない電力で達成!
タスクに応じたプロセッサーの使用。
その他の電力効率に関する例:
elinux.org/Jetson/Computer_Vision_Performance
GPIO
GPIO: General Purpose Input & Output(汎用入出力)
定義(Wikipedia英語版から):
入出力に使用する汎用の端子(ピン)。実行時にユーザによって操作でき、特
定の目的は持たない。設定されるまで利用されない。
利用方法:
ソフトウェアで他のデバイス/回路/コンポーネントを操作可能にする
ソフトウェアで他のデバイス/回路/コンポーネントからの変化を検知可能にす
る
例:
USBカメラからの入力に応じてサーボを制御する
Working with J3A2 Header
接続するピンの場所に注意してください!
(Jetson TK1の場合)GPIOピンは1.8Vしか扱えません。
それ以上の場合、ボードを損傷する可能性があります。
今回はピン43, 45, 46, and 49 を利用します
ボード上のシルクスクリーンの「三角」がピン1を、「2」がピン2
を表し、そこから数えていきます
Task #5: Connect Components & Test
Goal: basic_blink.py を実行してLEDを点滅させる
Task:
LED の抵抗の付いていない側の足をピン 43 (GPIO_PU1) に接続(済)
LED の抵抗の付いている側の足をピン45 (GND)に接続(済)
以下を実行:
sudo python ~/lab/gpio/basic_blink.py⏎
Result: LEDが10回点滅する
Task #6: Input & Output of GPIOs
Goal: advanced_blink.py を実行してスイッチの入力に応じてLED
点滅
Task:
タクトスイッチの片方の足をピン 46 (GPIO_PU2) に接続(済)
タクトスイッチの片方の足をピン pin 49 (GPIO_PU3)に接続(済)
以下を実行:
sudo python ~/lab/gpio/advanced_blink.py⏎
Result: スイッチを押している間のみLEDが素早く点滅する
追加ポイント: advanced_blink.py を変更して点滅周期を早めて
みる
Task #6 – 結果例
点滅速度を変更するには、次の行を変更 in advanced_blink.py
BLINK_INTERVAL = 100 #milliseconds
GPIO Summary
ソフトウェアから1.8Vを作ったり検知したりできる
外部デバイスの制御
To learn more: http://elinux.org/Jetson/GPIO
誤接続に注意!
Learning More
Community Wiki: elinux.org/Jetson_TK1
Jetson TK1 Support Page:
developer.nvidia.com/jetson-tk1-support
質問がある場合は:
Forum: devtalk.nvidia.com -> Embedded Systems
stackoverflow.com
Task #6: Power down system
以下を実行: sudo poweroff⏎
LEDとスイッチを取り外してから箱にしまって下さい
USBハブを USBカメラは差し上げますので、お持ち帰りください