• 検索結果がありません。

プログラムがうまく動かない! ―CUDA のバグの見つけ方―

N/A
N/A
Protected

Academic year: 2021

シェア "プログラムがうまく動かない! ―CUDA のバグの見つけ方―"

Copied!
33
0
0

読み込み中.... (全文を見る)

全文

(1)

プログラム

かない

―CUDA

バグ

つけ

方―

(2)

Agenda

- 1 of 3

• デバッグ

ノウハウ

紹介

します

• 商用ソフトウェア開発

での

実例

をとりあげます。

– Particleworks

K20 対応

• (注)

今回

れません

– NVIDIA Parallel Nsight

– CUDA-GDB

– CUDA-MEMCHECK

– Etc.

(3)

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

(4)

Agenda

- 3 of 3

• デバッグに役立ったこと

1.

詳細

実行ログ

出力

できるようにしておこう

意外

役立

2.

CUDA カーネル

対応

した

HOST コード

用意

しよう

単体テスト

ができるように

3.

HOST コード

に置き換えて

実行

できるようにしておこう

結合テスト

ができるように

4.

HOST

DEVICE

計算結果

比較

できるようにしておこう

単体テスト

結合テスト

両方

5.

CUDA

しくみ

しくなろう

(5)
(6)

Company Information

■会社名

プロメテック・ソフトウェア株式会社

2004年10月29日

■設立年月日

201,610千円

■資本金

■主要株主

株式会社構造計画研究所

三菱 UFJ キャピタル株式会社

大和企業投資株式会社

SMBC ベンチャーキャピタル株式会社

安田企業投資株式会社

りそなキャピタル株式会社

プロメテック・ソフトウェア協力研究者持株会

プロメテック・ソフトウェア従業員持株会

■役員

岡本伸一 藤澤智光 越塚誠一

角家強志 島田憲成 花田孔明

(7)

Access

■所在地

〒113-0033 東京都文京区本郷 7-3-1

東京大学アントレプレナープラザ 3 階

(8)

Timeline

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

(9)

Tasks

• Software Testing

– すべて

例題

(Particleworks に付録)

– いくつか

顧客事例

• Performance Measurements

– いくつか

例題

– いくつか

顧客事例

• Performance Tunings

• (Software Debugs)

dam-break gearbox

(10)

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

(11)

Performance Turnings

for Kepler

• Read Only Cache Memory

• Warp Shuffle Operations

• Grid and Block size Optimization

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)

(12)

Status

• 動作確認済

– GeForce GTX 640 (K10)

– Early Access Program (K20)

(13)
(14)

Logs

• 実行ログ

チェック

– ど

ういう

状況

停止

しているか

確認

できる

• printf debug

• Logger

– 出力

詳細度

変更

できるようにしておく

• 変数

ウォッチ

• コールツリー

1. 詳細

実行ログ

出力

できるようにしておこう

(15)

Bugs

• 特定

テストケース

解析

発散

する

– し

かも Tesla

K20c

実行

したときだけ

• クーラン条件

たせなくなり

解析

停止

する

– 安定

した

解析

のための

条件

– 粒子

速度

きくなりすぎること

– ど

こかの

カーネル

計算

がおかしい

• 止

まるときと

まらないときがある

– 粒子数

解析

(20 万以上)

まりやすい

– 並列計算

する

バグ?

(16)

CFL condition

– Courant-Friedrichs-Lewy

条件

たしている

条件

たしていない

Time Step: t

Time Step: t+1

(17)

Unit Testing

(Tesla K20)

[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 コード

用意

しよう

(18)

Integration Testing

(Tesla K20) - 1 of 2

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

する

(19)

Integration Testing

(Tesla K20) - 2 of 2

… 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

出力結果:

(20)

3 Bugs

1. Prefix Sum (scan)

2. Sort

3. 粉体

計算部

:

接触判定 + 摩擦力計算

– 原因不明

– 単体テスト

パス

する

– HOST

DEVICE

ている

• 同

じような

コード

– 計算結果

けているようにみえる

• レジスタ

Thrust

(21)
(22)

NVCC

- NVIDIA CUDA Compiler

• た

まに

コンパイラ

ちる

– 複雑

ヘッダファイル

ましていると

(23)
(24)

NVCC has bugs?

れまで

計算

問題

はなかった

– Tesla K20 特有

問題?

Tesla K20

わったこと:

– Compute Capability

3.5

になった

– 利用

できる

レジスタ数

えた

• バグ

があるとしたら

めしに

__launch_bounds__(T, B)

調整

してみる

……

– T: ブロック

あたりの

最大スレッド数

– B: マルチプロセッサ

あたりの

最小ブロック数

(25)
(26)

PTX

- Parallel Thread eXecution

.visible .entry _Z28dem_collision_pp_calc_... … ) .maxntid 384, 1, 1 .minnctapersm 1 { .reg .pred %p<11>; .reg .s32 %r<59>; .reg .s64 %rd<59>; .reg .f64 %fd<222>; …

変更前: __launch_bounds__(

384

, 1)

.visible .entry _Z28dem_collision_pp_calc_... … ) .maxntid 1024, 1, 1 .minnctapersm 1 { .reg .pred %p<11>; .reg .s32 %r<59>; .reg .s64 %rd<59>; .reg .f64 %fd<222>; …

変更後: __launch_bounds__(

1024

, 1)

maxntid 以外

はすべて同じ

(27)

LLVM

- Low Level Virtual Machine

– LLVM

基礎

としている

• 独自拡張

もできる

– CUDA Compiler SDK

• NVVM IR

(libNVVM)

• CUDA driver

があやしい

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)

(28)

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 月末)

(29)

プログラム

かない

CUDA

バグ

つけ

(30)

CUDA driver

(31)

Summary

• デバッグに役立ったこと

1.

詳細

実行ログ

出力

できるようにしておこう

意外

役立

2.

CUDA カーネル

対応

した

HOST コード

用意

しよう

単体テスト

ができるように

3.

HOST コード

に置き換えて

実行

できるようにしておこう

結合テスト

ができるように

4.

HOST

DEVICE

計算結果

比較

できるようにしておこう

単体テスト

結合テスト

両方

5.

CUDA

のしくみに

しくなろう

(32)

Event

- Simulation Conference 2013

2013-09-12 (木) 10:00 @ 東京コンファレンスセンター・品川

参加費: 無料 (要事前登録)

株式会社日立製作所 株式会社資生堂 積水エンジニアリング株式会社 株式会社キタック 株式会社トプコン 住友重機械工業株式会社

■主催

プロメテック・ソフトウェア株式会社 日本 GPU コンピューティング有限責任事業組合 NVIDIA Japan 株式会社構造計画研究所 株式会社エルザ ジャパン サイバネットシステム株式会社 ほか

■協賛

■基調講演

青木 素直 (株式会社三菱総合研究所 副理事長) 姫野龍太郎 (独立法人理化学研究所 情報基盤センター長) 越塚 誠一 (東京大学大学院工学系研究科 教授)

■パネルディスカッション

メニ―コア新時代! ソフトウェア開発の現場から見えてきた課題と期待

■特別講演/事例講演

http://www.prometech.co.jp/

(33)

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)

参照

関連したドキュメント

ダイダン株式会社 北陸支店 野菜の必要性とおいしい食べ方 酒井工業株式会社 歯と口腔の健康について 米沢電気工事株式会社

2【 ME 】シート 記入日(       ) 名前 呼ばれたい ニックネーム. 学校(所属)

2022.7.1 東京電力ホールディングス株式会社 東京電力ホールディングス株式会社 渡辺 沖

日時:2013 年 8 月 21 日(水)16:00~17:00 場所:日本エネルギー経済研究所 会議室 参加者:子ども議員 3 名 実行委員

東京電力パワーグリッド株式会社 東京都千代田区 東電タウンプランニング株式会社 東京都港区 東京電設サービス株式会社

東電不動産株式会社 東京都台東区 株式会社テプコシステムズ 東京都江東区 東京パワーテクノロジー株式会社 東京都江東区

東京電力パワーグリッド株式会社 東京都千代田区 東電タウンプランニング株式会社 東京都港区 東京電設サービス株式会社

東電不動産株式会社 東京都台東区 株式会社テプコシステムズ 東京都江東区 東京パワーテクノロジー株式会社 東京都江東区