Post on 27-Jan-2021
プログラムがうまく動かない! ―CUDA のバグの見つけ方―
北岡 伸也
2013-07-30 1 GTC Japan 2013 @ Tokyo Midtown Hall & Conference
Agenda - 1 of 3 • デバッグのノウハウを紹介します。
• 商用ソフトウェア開発での実例をとりあげます。 – Particleworks の K20 対応
• (注) 今回は触れません – NVIDIA Parallel Nsight
– CUDA-GDB
– CUDA-MEMCHECK
– Etc.
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 2
Agenda - 2 of 3 • Particleworks - 商用流体解析ソフトウェア
– プロメテックソフトウェア株式会社で開発している製品
– v4.5 から CUDA 5.0 & Tesla K20 に対応 – Fundamental Algorithms
• MPS method - Moving Particle Simulation (Semi-implicit)
• DEM - Distinct Element Method
• Solver on GPUs – コード行数: ~150,000
– カーネル数:
Agenda - 3 of 3 • デバッグに役立ったこと
1. 詳細な実行ログを出力できるようにしておこう
• 意外と役立つ
2. CUDA カーネルに対応した HOST コードを用意しよう
• 単体テストができるように
3. HOST コードに置き換えて実行できるようにしておこう
• 結合テストができるように
4. HOST と DEVICE の計算結果を比較できるようにしておこう • 単体テストと結合テストの両方で
5. CUDA のしくみに詳しくなろう
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 4
Particleworks
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 5
Company Information ■会社名 プロメテック・ソフトウェア株式会社
2004年10月29日 ■設立年月日
201,610千円 ■資本金
■主要株主 株式会社構造計画研究所
三菱 UFJ キャピタル株式会社
大和企業投資株式会社
SMBC ベンチャーキャピタル株式会社
安田企業投資株式会社
りそなキャピタル株式会社
プロメテック・ソフトウェア協力研究者持株会
プロメテック・ソフトウェア従業員持株会
■役員 岡本伸一 藤澤智光 越塚誠一
角家強志 島田憲成 花田孔明
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 6
Access
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 7
■所在地 〒113-0033 東京都文京区本郷 7-3-1
東京大学アントレプレナープラザ 3 階
■URL http://www.prometech.co.jp/
Timeline
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 8
CUDA Toolkit v5.0
Particleworks v4.5
Tesla K20
2012-10
2013-02
2012-11
2012-12
2013-01
Tesla K20 Early Access Program
作業期間 (約2ヶ月)
NVIDIA Manufacturing Day 2013
K20c
Tasks • Software Testing
– すべての例題 (Particleworks に付録)
– いくつかの顧客事例
• Performance Measurements – いくつかの例題
– いくつかの顧客事例
• Performance Tunings
• (Software Debugs)
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 9
dam-break
gearbox
Development Environment (Windows) • Redmine
– Project Management
• Subversion (+ Git) – Version Control System
• Microsoft Visual Studio 2010 (+ CUDA 5.0) – IDE; Integrated Development Environment
• Google Test – Testing Framework
• Jenkins – CI; Continuous Integration
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 10
Performance Turnings for Kepler • Read Only Cache Memory
• Warp Shuffle Operations
• Grid and Block size Optimization
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 11
cf. NVIDIA Manufacturing Day 2013, Particleworks
Case 1 Case 2 Case 3 Case 4 Case 5
# of Particles 807,885 344,633 366,210 295,113 861,042
Pressure (Implicit) x x x x x
Viscosity (Implicit) x x
Surface Tension x x
Turbulence x
DEM x
Performance Gain 1.44 1.57 1.43 1.45 1.49
1.47x (C2075 / K20c)
Status • 動作確認済み
– GeForce GTX 640 (K10)
– Early Access Program (K20)
• すぐにテストをパスできるだろう……
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 12
あれっ?
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 13
Logs
• 実行ログをチェック – どういう状況で停止しているか確認できる
• printf debug
• Logger – 出力の詳細度を変更できるようにしておく
• 変数のウォッチ
• コールツリー
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 14
1. 詳細な実行ログを出力できるようにしておこう
Bugs • 特定のテストケースで解析が発散する
– しかも Tesla K20c で実行したときだけ
• クーラン条件を満たせなくなり解析が停止する – 安定した解析のための条件
– 粒子の速度が大きくなりすぎること
– どこかのカーネルの計算がおかしい
• 止まるときと止まらないときがある – 粒子数が多い解析 (20 万以上) で止まりやすい
– 並列計算に関するバグ?
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 15
CFL condition – Courant-Friedrichs-Lewy
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 16
条件を満たしている 条件を満たしていない
Time Step: t
Time Step: t+1
衝突 すり抜ける
Unit Testing (Tesla K20)
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 17
[spmv.cpp]
void hst_spmv(…) { … }
[spmv.cu]
__global__ void spmv_kernel(…) { … } void dev_spmv(…) { spmv_kernel(…); }
[spmv.h]
void hst_spmv(…); void dev_spmv(…);
2. CUDA カーネルに対応した HOST コードを用意しよう
Integration Testing (Tesla K20) - 1 of 2
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 18
hst_spmv( y .get(hst_mode, write_mode), row_ptr.get(hst_mode), col_ind .get(hst_mode), a .get(hst_mode), x .get(hst_mode), n);
メモリバッファを抽象化しておく • HOST と DEVICE を対応付けて管理する • 変更を相互に反映させる • 取得時に変更されていたらコピーする
3. HOST コードに置き換えて実行できるようにしておこう
dev_spmv( y .get(dev_mode, write_mode), row_ptr.get(dev_mode), col_ind .get(dev_mode), a .get(dev_mode), x .get(dev_mode), n);
動作 • 変数はすべて抽象化したバッファ • 取得モードで返す生ポインタの アドレスを変更 • 読み込みモードで取得されたあと 異なる取得モードでとりだされたら cudaMemcpy する
Integration Testing (Tesla K20) - 2 of 2
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 19
… Prometech::NeighborSearchGPU::Calculate { Prometech::NeighborSearchGPU::calculate_distribution { pw::ArrayManagerMethod::exchange_distributed_buffer_all { } debug: exchange_distributed_buffer_all : end . @ pw::ArrayManager::exec(2497) } Prometech::NeighborSearchGPU::calculate_particle { pw::ArrayManagerMethod::construct_neighbor_table_large { debug: buffer = particle.collide_hash.int2.1.2 , size = 203334 @ pw::ArrayManagerMethod::set_array(526) debug: buffer = particle.collide_mibb_buf.double3.1.1 , size = 64 @ pw::ArrayManagerMethod::set_array(526) debug: buffer = particle.collide_mabb_buf.double3.1.1 , size = 64 @ pw::ArrayManagerMethod::set_array(526) debug: bbmin = -1.10553 -0.685474 -0.637836 @ pw::ArrayManagerMethod::set_collision_slice(304) debug: bbmax = 1.10555 1.10542 0.637635 @ pw::ArrayManagerMethod::set_collision_slice(305) debug: ngrid = 45 36 26 @ pw::ArrayManagerMethod::set_collision_slice_array(313) debug: buffer = particle.collide_slice_sum.int.1.1 , size = 27 @ pw::ArrayManagerMethod::set_array(526) debug: buffer = particle.collide_slice.int4.1.1 , size = 26 @ pw::ArrayManagerMethod::set_array(526) debug: buffer = particle.collide_slice_offset.int4.1.1 , size = 26 @ pw::ArrayManagerMethod::set_array(526) …
Logger の出力結果:
4. HOST と DEVICE の計算結果を比較できるようにしておこう
3 Bugs 1. Prefix Sum (scan)
2. Sort
3. 粉体計算部: 接触判定 + 摩擦力計算 – 原因不明
– 単体テストはパスする
– HOST も DEVICE も似ている
• 同じようなコード
– 計算結果が化けているようにみえる
• レジスタの値が変
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 20
Thrust に置き換え
ところで
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 21
NVCC - NVIDIA CUDA Compiler • たまにコンパイラが落ちる
– 複雑なヘッダファイルを読ましていると 字句解析でアサーションがでる
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 22
…ん?
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 23
NVCC has bugs? これまで計算に問題はなかった
– Tesla K20 特有の問題?
Tesla K20 で変わったこと: – Compute Capability が 3.5 になった
– 利用できるレジスタ数が増えた
• バグがあるとしたらここ?
ためしに __launch_bounds__(T, B) を調整してみる…… – T: ブロックあたりの最大スレッド数
– B: マルチプロセッサあたりの最小ブロック数
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 24
動いた!
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 25
PTX - Parallel Thread eXecution
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 26
.visible .entry _Z28dem_collision_pp_calc_... … ) .maxntid 384, 1, 1 .minnctapersm 1 { .reg .pred %p; .reg .s32 %r; .reg .s64 %rd; .reg .f64 %fd; …
変更前: __launch_bounds__(384, 1)
.visible .entry _Z28dem_collision_pp_calc_... … ) .maxntid 1024, 1, 1 .minnctapersm 1 { .reg .pred %p; .reg .s32 %r; .reg .s64 %rd; .reg .f64 %fd; …
変更後: __launch_bounds__(1024, 1)
maxntid 以外はすべて同じ
LLVM - Low Level Virtual Machine
– LLVM を基礎としている
• 独自拡張もできる – CUDA Compiler SDK
• NVVM IR (libNVVM)
• CUDA driver があやしい
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 27
CUDA C/C++ front-end
NVVM IR (LLVM IR 互換)
LLVM optimizer
PTX back-end
CUDA C/C++ (*.cu)
PTX (*.ptx)
CUDA binary
CUDA driver (JIT compiler)
5. CUDA のしくみに詳しくなろう
Bug Report • 動作確認ができたのでソフトウェアは Fix (1 月末)
• CUDA Registered Developer Program https://developer.nvidia.com/rdp/cuda-registered-developer-program
– CUDA/GPU Bug Reporting https://developer.nvidia.com/rdp/bugs/cudagpu-bug-reporting
– Submissions https://developer.nvidia.com/node/233301/submissions
• NVIDIA 側でも不具合の再現 (2 月末)
• CUDA 5.5 RC の driver で修正 (5 月初)
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 28
プログラムがうまく動かない! ―CUDA のバグの見つけ方―
北岡 伸也
2013-07-30 29 GTC Japan 2013 @ Tokyo Midtown Hall & Conference
CUDA driver の バグを見つけました。
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 30
Summary • デバッグに役立ったこと
1. 詳細な実行ログを出力できるようにしておこう
• 意外と役立つ
2. CUDA カーネルに対応した HOST コードを用意しよう
• 単体テストができるように
3. HOST コードに置き換えて実行できるようにしておこう
• 結合テストができるように
4. HOST と DEVICE の計算結果を比較できるようにしておこう • 単体テストと結合テストの両方で
5. CUDA のしくみに詳しくなろう
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 31
Event - Simulation Conference 2013
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 32
2013-09-12 (木) 10:00 @ 東京コンファレンスセンター・品川
参加費: 無料 (要事前登録)
株式会社日立製作所
株式会社資生堂
積水エンジニアリング株式会社
株式会社キタック
株式会社トプコン
住友重機械工業株式会社
大日本スクリーン製造株式会社
■主催 プロメテック・ソフトウェア株式会社 日本 GPU コンピューティング有限責任事業組合
NVIDIA Japan 株式会社構造計画研究所 株式会社エルザ ジャパン サイバネットシステム株式会社 ほか
■協賛
■基調講演 青木 素直 (株式会社三菱総合研究所 副理事長) 姫野龍太郎 (独立法人理化学研究所 情報基盤センター長) 越塚 誠一 (東京大学大学院工学系研究科 教授)
■パネルディスカッション
メニ―コア新時代! ソフトウェア開発の現場から見えてきた課題と期待
■特別講演/事例講演
http://www.prometech.co.jp/
Job Offer – Product Development Dept. • Researches
– Mathematics
• Linear Algebra
• Mathematical Analysis
– Differential equations
– (Function Approximation)
– Physics
• Incompressible Fluid
– (Non-Newtonian Fluid)
– (Turbulence)
– (Surface tension)
– (Heat conduction/transfer)
• Powder / Rigid Body
– Numeric analysis
• MPS / SPH / DEM
• (LBM / FDM / FEM / BEM)
• Software Developments
– OSs
• Windows
• Linux / (Mac)
– Languages
• C++ (STL, Boost, 11/14)
• CUDA
• Java
• (Python)
– Techniques
• Algorithms & Data Structures
• OOP / (TMP) / Design Patterns
• SIMD (SPMD) / OpenMP / MPI
• (Concurrency Programming)
• HCI (UI / UX)
2013-07-30 GTC Japan 2013 @ Tokyo Midtown Hall & Conference 33