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.cpp | 5.67 KB |
testsgemm.cpp | 5.61 KB |
- plattojpさんのブログ
- ログインしてコメントを投稿
最近のコメント
6年 2週前
7年 51週前
7年 51週前
7年 51週前
8年 9週前
8年 9週前
8年 10週前
8年 10週前
8年 25週前
8年 25週前