テストレポート
Tegra K1搭載の開発キット「Jetson TK1」を動かしてみた
今回4Gamerでは,そんなJetson TK1を実際に体験できるというセッションへ参加できたので,「Tegra K1搭載のワンボードコンピュータ」に触ってきた模様を簡単にまとめてみたいと思う。ゲームと直接の関係はないが,Tegra K1が気になっている人や,CUDAに興味がある人はチェックしてほしい。
ようこそJetson TK1へ
さて,セッションルームでは,各席にディスプレイやキーボードとの接続を終えたJetson TK1が置いてあり,受講者はすぐにJetson TK1を体験できるようになっていた。
キーボードやマウスは,USB接続のものならメーカーは不問で,Webカメラも,よほど特殊な仕様でない限り接続できるとのことだった。
電源ユニットは,ノートPCに付属してきそうなACアダプターで,入力はAC100-240V/1.5A,出力はDC12V/5.0Aというスペックだ。これをJetson TK1の電源入力端子に接続すると,いきなりJetson TK1上の冷却ファンが回り始めて起動する仕様になっていた。万が一起動しない場合は,Jetson TK1上に用意された小さな[Reset]ボタンもしくは[Soft Power]ボタンを押すと再起動できるようだ。
起動後,最初にやるべきこととして指導されたのは,[Ctrl]+[Alt]+[T]キーでコマンドプロンプトを出してからの,
> setxkbmap -layout jp
の入力で,これは,キーボードのレイアウトを日本語仕様へ変更する操作に相当する。
起動してしまえば,ただのUbuntu搭載PCといった感じで,LANケーブルでネットワークと接続すれば,プリインストールの「Mozilla Firefox」からWebブラウジングも普通に行えてしまう。
「CUDAのプログラミングの基礎の基礎」を体験
ここで,「Hello」を出力するだけの基礎的なプログラムの入力が課せられた。
CUDAは,C言語ベースのプログラミング言語なのだが,「用意したデータに対してプログラムを実行させる」という概念の拡張がなされている。それを参加者に実感してもらおうというのが狙いだ。
今回の「Hello」では,2×2のスレッドを立ち上げて,各スレッドから「Hello」を出力するようなプログラムになっていた。
サンプルリストはEbersole氏がスライドで示していたので,実際にやることはといえば,画面のサンプルを打ち込み,コンパイルして実行するだけだ。
ただ,CUDAの完全な初心者からすれば,テキストエディタとして「gedit」が用意されているとか,CUDAのソースプログラムは拡張子「.cu」で作成するとか,コンパイラは「nvcc」であるとかいった基礎的なことをここで学べるのであった。
CUDA 6のサンプルプログラムを実行する
続いての課題は,Jetson TK1にプリインストールされているCUDA 6のサンプルプログラムをコンパイルして実行することである。
ここではまず,コマンドプロンプトからCUDA 6のサンプルプログラムをコピーするところから始まる。具体的には,
> cuda-install-samples-6.0.sh .
と入力することになる。最後のスペースとピリオドを忘れずに。
続いて,
> cd NVIDIA_CUDA-6.0_Samples/5_Simulations/smokeParticles/
と入力し,カレントディレクトリをサンプルプログラム階層の下とする。長いパス名は中途まで打ち込んで[TAB]キーを押すと補完入力を行ってくれるので利用したい。
コンパイルは,
> make
でOK。プログラムを書き換えない限り,コンパイルは一度実行すればそれでいい。
実際のプログラム実行は,
> ../../bin/armv7l/linux/release/gnueabihf/smokeParticles
で行える。「smokeParticles」のところを別のプログラム名にすれば,別のサンプルプログラムをコンパイルして実行することも可能だ。
サンプルプログラムを確認してみたところ,「NVIDIA_CUDA-6.0_Samples」階層下にはさまざまなものを確認できたので,Jetson TK1を入手できたら,いろいろと実行してみるといいのではなかろうか。見た目的に面白いのは,前出の「5_simulations」以外だと「2_Graphics」あたりか。
コンピュータビジョンのサンプルプログラムを実行する
具体的にはコンピュータビジョン用プログラミングAPI「OpenCV」のサンプルコードをJetson TK1上で実行する課題となる……のだが,その前に,Webカメラの動作を確認する必要がある。
このカメラ動作確認プログラムは,「検出した肌色部分を緑色にマーキングする」というもので,人の顔が緑色にマーキングされればOKとなる。
Webカメラの動作が完了したところで,実際のCPUで実装したOpenCVサンプルプログラムを実行する。
実行するのは,監視カメラのように定点設置されたカメラの映像から,動体と背景を分離するアルゴリズム「混合正規分布」(MOG:Mixture of Gaussian Distribution)のサンプルだ。
コンパイル後,
> ./bgfg_segm_cpu -c 0
として実行されるのがCPU版MOGアルゴリズムとなる。実効フレームレートにして約5〜7fpsといったところだ。
続いては,このサンプルプログラムをGPU版に改造する課題が出されたのだが,セッション時間が短いこともあり,今回は,
> cp bgfg_segm_solution.cpp bgfg_segm_gpu.cpp
と打ち込み,模範回答プログラム「bgfg_segm_solution.cpp」を「bgfg_segm_gpu.cpp」としてコピーしてコンパイルするのみに留まった。具体的には,
> make gpu
でコンパイルし,
> ./bgfg_segm_gpu -c 0
で実行する。
同一アルゴリズムを実行しているので,処理内容に変わりはない一方で,実効フレームレートは最大で10倍以上向上することを確認できた。これこそがGPUパワーの恩恵であり,Jetson TK1,そしてTegra K1の底力というわけである。
Jetson TK1でGPIOを制御する
Jetson TK1には,先に述べたUSB 3.0のほか,シリアルポートも用意されているが,それよりもさらにローレベルな入出力を行うためのGPIO(General Purpose Input & Output)ポートも備わっている。
ここまでの課題は,どちらかといえば「コンピュータとしてJetson TK1をどう使うか」が対象となっていたが,最後の課題は,GPIOを使って外部デバイスとの連動を目指すものとなった。
とはいえ,短い時間でそれほど高度なことはできないので,接点スイッチとLEDを組み合わせたシンプルな実験が行われた。
最初の実験は,43番ピンと45番ピンに差し込まれたLEDを点滅させるという課題だ。
プログラムは「~/lab/gpio/」フォルダに用意されているので,実際にやることは,
> sudo python ~/lab/gpio/basic_blink.py
として実行させるだけである。
最後の課題は,GPIO側の46番ピンと49番ピンに接点スイッチを設け,このオン/オフを仮想的な周辺機器からの入力とし,それに呼応する形でプログラム側でLEDを点灯させるというものだ。
こちらもプログラム自体は保存済みなので,
> sudo python ~/lab/gpio/advanced_blink.py
追加のサブ課題として,LEDの点滅タイミングを変更するというのが与えられたが,これはプログラムを開いて「BLINK_INTERVAL =」の数値を変えるだけでOK。Pythonはスクリプト言語なので再コンパイルの必要もなく,すぐに数値変更の結果を反映した形で実行できるのだ。
“遊べる”評価ボードといえるJetson TK1
まさに入門といった内容だったが,いかがだったろうか。
Jetson TK1は組み込み機器向けの製品開発評価プラットフォームで,今のところ流通量も非常に少ないが,国内ではオリオスペックが正規品を扱っているので,2万4000円+税で次回以降の入荷分を予約できる。大学の研究室はもちろんのこと,個人レベルの電子工作用途にも応用できそうである。
これまで,ここまで高性能なGPUパワーを使ってさまざまな周辺機器と連動させられる安価なワンボードコンピュータはほとんどなかった。少なくとも筆者の知る限りは皆無だったように思う。Microsoftの「Kinect」が,その性能でアマチュア電子工作シーンにモーションセンシングブームを広めたように,Jetson TK1も今後,流通量が増えるにつれ,広がりを見せていくかもしれない。