NVIDIA JetsonTK1 計算性能実測

ふぅ〜。昨年末に買ったNEWアイテム「NVIDIA Jetson TK1」で年明けからずーっと遊んでます!

”組み込みスーパーコンピューター ”というふれこみにうっかり釣られて入手してしまったのですが、cudaコア192個搭載でGPUのクロックがピーク0.852GHz、1クロックで積和計算1回とのことで、単精度浮動小数点数(以下 単精度 倍精度)計算理論値性能 326Gflops (192*0.852*2、そしてもしや倍精度でも100G超???)。それが127mm四方の基板に乗ったシングルボードコンピュータでのご提供ときたら、わくわくする人はワクワクしますよね〜。何台か買ってクラスタ構築!!と夢はひろがるばかりです。が、はたしてその実際の性能は夢の大きさに相応しいものなのかどうか? ここ数日は計算能力の計測にはまっていました。

いくつかの条件で計測してみました(共通:Xのデスクトップ環境が動作したまま)。

1.Octaveで行列計算

・CPU: ”通常パッケージ”版のOctaveで単精度、倍精度行列計算

・GPU: cuBLAS acceleratedな Octaveをビルドし、単精度、倍精度行列計算

2.Rで行列計算

・CPU: ”通常パッケージ”版のRで単精度、倍精度行列計算

・GPU: cuBLAS acceleratedな Rをビルドし、単精度、倍精度行列計算

3.C/C++で行列計算

・CPU: ふつーに forループで単精度、倍精度行列計算

・GPU: cuBLAS関数をつかって、単精度、倍精度行列計算

結果:

1.Octave-3.8.2

N="mat size"; A=double(randn(N)); B=double(randn(N));
start=clock(); C=A*B; elapsedTime=etime(clock(),start);
disp(2*N*N*N/(elapsedTime*1e+9));
※単精度のときは、single()としました。
mat size Gflops
double precision single precision
CPU GPU CPU GPU
32 0.19 0.04 0.19 0.03
64 0.84 0.20 1.00 0.28
128 2.22 1.30 2.60 1.45
256 2.95 4.40 3.65 9.00
512 3.23 8.30 3.83 30.00
1024 3.32 10.70 3.89 76.00
2048 3.37 11.60 3.93 121.00
4096 3.37 11.20 3.97 145.00
8192 3.13 *1
3.98 62.00

2.R-3.1.2

N="mat size";
A<-matrix(0.01*1:0.01*N*N, N, N); B<-matrix(0.01*1:0.01*N*N, N, N);
startT<-proc.time()[3]; C<-A%*%B; endT<-proc.time()[3];
2*N*N*N/((endT-startT)*1e+9);
※Rはデータはすべて倍精度で持つらしいです。
mat size Gflops
double precision single precision
CPU GPU CPU GPU
32 0.07 0.03 - -
64 0.52 0.17 - -
128 0.83 1.00 - -
256 0.86 3.40 - -
512 0.81 6.60 - -
1024 0.74 7.50 - -
2048 0.73 10.80 - -
4096 0.66 10.80 - -
8192 0.62 *1 - -

3.C / C++

倍精度版:cublasDgemm使用 testdgemm.cpp
単精度版:cublasSgemm使用 testsgemm.cpp
mat size Gflops
double precision single precision
CPU GPU CPU GPU
32 0.20 2.02 0.21 1.96
64 0.17 9.76 0.19 15.78
128 0.14 11.29 0.14 66.30
256 0.12 11.97 0.13 104.17
512 0.06 12.29 0.11 180.44
1024 0.03 12.65 *2 204.72
2048 0.03 12.81 - 209.88
4096 *2 11.77 - 204.35
8192 - *1 - 150.87

*1 cudaMalloc()が allocation errorとなって計算できませんでした。

*2 計算に時間がかかりすぎてプログラムがなかなか終了しないのでもうヤメw

参考
インテル® Core™ i7-3770 3.4GHz Ubuntu12.04LTS Octaveで D.P.12Gflops S.P.15Gflopsほど。
インテル® Core™ i7-4790 3.6GHz Ubuntu14.04LTS Octaveで D.P.15Gflops S.P.30Gflops ほど。

C/C++でのCPUのflops値が低いような気がしますが、プログラムが間違っているとか時間の測り方が間違っているとか原因があるのかもしれません。

 

結論:"スーパーコンピュータ"というキーワードと理論値性能に過度な期待を寄せてはいけません。スーパーコンピュータのテクノロジーに触れることもできる楽しい電子工作アイテム、といったところが実際ではないでしょうか。倍精度計算が予想を完全に裏切る結果となりましたが、そもそも車載組み込みやモバイル端末で厳密な科学計算する必要なんかあまりないだろうし、画像処理やゲームするぐらいなら単精度で十分なんでしょうね。さて、小規模クラスタ組んでOpenMPIとかもいじってみる予定もあって楽しみなんですが、さしあたり次はOpenCVにいってみようかな。OpenCVはオプションでcuBLASサポートしていて、WITH_CUBLAS:ONにして既にビルド済となってはいます。どんな変化があらわれるのか? っていうか、すでにXiaomiがTegraK1SOC搭載したMiPadての販売中だけどw

 

添付サイズ
testdgemm.cpp5.67 KB
testsgemm.cpp5.61 KB