脳汁portal

アメリカ在住(だった)新米エンジニアがその日学んだIT知識を書き綴るブログ

モバイル・スパコンJETSON tk1にCUDAをinstallする方法

NVIDIAのJETSON tk1にCUDAをinstallする方法です
f:id:portaltan:20160204161832p:plain

手順

CUDA-6.0をデフォルトのubuntu14.04にinstallします

wget http://developer.download.nvidia.com/compute/cuda/6_0/rel/installers/cuda-repo-l4t-r19.2_6.0-42_armhf.deb
sudo dpkg -i cuda-repo-l4t-r19.2_6.0-42_armhf.deb
sudo apt-get update
sudo apt-get install cuda-toolkit-6-0

ls -l /usr/local/cuda*
  lrwxrwxrwx 1 ubuntu ubuntu    8 Feb  4 06:52 cuda -> cuda-6.0/
  drwxrwxr-x 2 ubuntu ubuntu 4096 Feb  4 06:52 cuda-6.0/

vi ~/.bashrc
====以下を追加========
export PATH=/usr/local/cuda-6.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-6.0/lib:$LD_LIBRARY_PATH
====以上を追加========

bash
nvcc -V

これでversion情報が出てくればOKです

試しにHello world 書いてみる

mkdir cuda_test
cd cuda_test


### cudaファイルを作成
vi hello.cu
====以下を入力========
#include <stdio.h>

__global__ void hello() {
    printf("Hello from %d.%d\n", blockIdx.x, threadIdx.x);
}

int main() {
    hello<<<3,2>>>();
    cudaDeviceSynchronize();
    return 0;
}
====以上を入力========

### コンパイル
nvcc -o hello hello.cu

### 実行
./hello
  ### 表示の順番は実行毎に変わります
  hello from 2.0
  hello from 2.1
  hello from 0.0
  hello from 0.1
  hello from 1.0
  hello from 1.1

code解説

__global__
  3 __global__ void hello() {
  • このコープ宣言は、この関数がGPU側で動作する(カーネル)関数であるという宣言
  • ホスト側からのみ呼び出すことが出来る
  • 呼び出し時に<<<>>>を使って条件を指定できる


threadIdx.x / blockIdx.x
  4     printf("Hello from %d.%d\n", blockIdx.x, threadIdx.x);
  • threadIdx.x
    • カーネルが動作しているスレッドのインデックス番号(何番目のスレッドか)を表す
  • blockIdx.x
    • threadIdxの上位にある
    • 現在のグリッド上でどのブロックが実行されているかを表す


main()
  7 int main() {
  • main()はホスト側で実行される


<<<>>>
  8     hello<<<3,3>>>();
  • グリッドの中のブロックの個数と、ブロックの中のスレッドの個数を設定する
  • 今回はブロックは3つで、その中で2つのスレッドが起動することを示す
  • 更に要素を追加して、3次元でまで表すことができる


cudaDeviceSynchronize
  9     cudaDeviceSynchronize();
  • GPUとCPUの処理を同期させる
  • カーネルの実行は非同期で行なわれるため、CPUに結果を転送する場合はこの関数でカーネル処理利が終了するまで待つ必要がある