Upload
others
View
30
Download
0
Embed Size (px)
Citation preview
GTC 2013 チュートリアル エヌビディアジャパン CUDAエンジニア 森野慎也
CUDA TIPS and FAQ
CUDA TIPS and FAQ
NVIDIA Japanでは、開発者のみなさんへの支援を
行っています。その中で…
よくいただく質問
「へー」と言ってもらえたこと
など、まとめて、お話しします。
Topic 1: Compute Capability
GPUのCompute Capabilityを知りたいのですが。
— お答え:
CUDA GPUs ページにアクセスしてください!
— https://developer.nvidia.com/cuda-gpus
Topic 1: Compute Capability
GPUの確認方法
Topic 2: 開発・デバッグ環境
開発環境は、何を使えばよいのですか?
Windows
— Windows XP以降で動作
— Visual Studio 2008, 2010, 2012
MacOS X
— 10.7.5+、10.8.x(64 bit)
— Compiler : gcc or clang*
*いくつかの機能はサポートされていません
Topic 2: 開発・デバッグ環境
サポートされている Linux
Distribution Version 32 bit 64 bit
Fedora 18 X
RedHat Enterprise 5.5+, 6.x X
OpenSUSE 12.2 X
SUSE SLES 11 SP1, SP2 X
Ubuntu 12.10, 12.04, 10.04 X X
Ubuntu (ARMv7) 12.04 X X
Topic 2: 開発・デバッグ環境
Nsight Visual Studio Edition
— CUDA Toolkitに含まれます。(CUDA 5.5より)
— Windows Vista以降
GPUカーネルのデバッグができます!
— Datatip 、Breakpoint(条件指定可能)、
assert()、デバイスメモリのダンプ
— Visual Studio IDEに、統合
Topic 2: 開発・デバッグ環境
VS2010
Topic 3: ホストコンパイラのオプション
質問 *.cuに書いた、CPUコードが遅いのです。 nvccの生成するコードが、遅いのでは?
— お答え nvccでは、ホストコードは、各プラットフォームのコンパイラで コンパイルされます。
— ホストコード用のコンパイルオプションを、指定してください。
Topic 3: ホストコンパイラのオプション
nvcc
— CUDA用のコンパイラ
内部で
ホストコンパイラを使用
— デフォルトでC++
ホストコンパイラの
オプションも指定します。
ソース
ホスト/GPU ソース分割
ホスト
コンパイラ
カーネル
コンパイラ
マージ
オブジェクト
Topic 3: ホストコンパイラのオプション
NVCCオプション
— -Xcompiler
ホストコンパイラ向けのオプション
— -ccbin
ホストコンパイラのパス指定
— -gencode
Compute Capability (GPUバージョン)の指定_35,sm_35
— -G
デバッグ情報生成
— -Xptxas
最適化に必要な情報を得るために指定
PTX(GPUアセンブラ)のオプション 11
Topic 3: ホストコンパイラのオプション
.SUFFIXES: .cpp .h .cu .o
DEBUG=0
CXXFLAGS=-Wall -g
NVCCFLAGS=-gencode arch=compute_30,code=sm_30 -Xptxas -v
(略)
all: …
.cu.o: $<
nvcc $(NVCCFLAGS) –Xcompiler “$(CXXFLAGS)” $< -o $@
.cpp.o: $<
g++ -c $(CXXFLAGS) $< -o $@
Topic 3: ホストコンパイラのオプション
Windowsの場合
Topic 4: 並列化
質問
CUDAでは、非常に多くのスレッドを使いますが、
スレッド数を増やすよりは、ループで書けませんか?
— お答え
通常、性能が出ないので、お勧めしません。
CUDAでは、多くのスレッドを動作させることで、性能が出ます。
— メモリコピーのコードで、説明します。
Topic 4: 並列化(Coalesced Access)
CUDAに適した並列化 (Coalesced Access)
int *dSrc 0 1 2 3 4 5 6 7 8
int *dDst
CUDA core
…
…
…
Topic 4: 並列化(Coalesced Access)
__global__
void coalescedMemcpyKernel(int *dDst, const int *dSrc, size_t size) {
/* Global IDを算出 */
int globalID = blockDim.x * blockIdx.x + threadIdx.x;
if (globalID < size) { /* 自スレッド担当の要素のみ、処理 */
dDst[globalID] = dSrc[globalID];
}
}
Thread 2 Thread 1 Thread 0
Topic 4: ループによる実装
スレッドでループ
— 1スレッドで、4回ループする場合
int *dSrc 0 1 2 3 4 5 6 7 8
int *dDst
Threads
…
…
…
Topic 4: 並列化(loop)
__global__
void loopMemcpyKernel(int *dDst, const int *dSrc,
size_t size, size_t loopCount) { /* Global IDを算出 */
int globalID = blockDim.x * blockIdx.x + threadIdx.x;
unsigned int begin = gid * loopCount;
unsigned int end = min((gid + 1) * loopCount, size);
for (unsigned int index = begin; index < end; ++index) {
dDst[index] = dSrc[index];
}
}
Topic 4: ベンチマーク結果
Tesla K20c ECC off
0
50
100
150
200
1 8 64 512 4096
バンド幅
(G
B/s
ec)
スレッドあたりのループ回数
ループによるコピー
Spec : 208 GB/sec
Coalesced Access : 146 GB/sec
Cache
Topic 4: 並列化
ループは、なぜ遅い?
— メモリアクセスが、歯抜けになっている!
Threads …
…
Thread 2 Thread 1 Thread 0
0 1 2 3 4 5 6 7 8 …
DRAM …
Topic 4: 並列化
スレッド(Warp)数が足りないと、性能が出ません。
スレッド(Warp)が
多数、実行されている。
スレッド(Warp)の
実行数がすくない。
Warp X
Warp A
Warp B
Warp C
Warp …
Warp …
Warp X
Warp A
Warp B
…
ca. 1
1 c
lock (K
eple
r)
ca. 2
2 c
lock (F
erm
i)
Stall
Warp A
Stall
Stall
Stall
Stall
Stall
Warp A
Stall
…
Topic 4: 並列化
メモリアクセスにも、スレッド(Warp)の数が必要です。
Warp X
Warp A
Warp B
Warp C
Warp …
Warp …
Warp X
Warp A
Warp B
スレッド(Warp)が
多数、実行されている。
…
メモリアクセス
要求が多い
バンド幅 大
スレッド(Warp)の
実行数がすくない。
Stall
Warp A
Stall
Stall
Stall
Stall
Stall
Warp A
Stall
…
メモリアクセス
要求が少ない
バンド幅 小
Topic 4: ベンチマーク(Thread数)
Tesla K20c (ECC off)
0
50
100
150
200
0 20 40 60
バンド幅
(G
B/se
c)
SMXあたりのWarp数
Spec : 208 GB/sec
Coalesced Access : 146 GB/sec
Topic 5: 開発者登録
NVIDIA Registered Developer program
— https://developer.nvidia.com/registered-developer-programs
誰でも登録できます。
— 企業の方、学生の方、皆さんOKです。
— 無償です。
メリット
— プレリリース版のダウンロード
— バグレポート
NVIDIA Japan CUDA Monthly Seminar
NVIDIA Japanでは、毎月、
CUDA関連の無償セミナーを実施しています。
— 申し込み :
http://www.nvidia.co.jp/object/event-calendar-jp.html
— 場所 : NVIDIA Japan 赤坂オフィス
— 定員 : 20名
Thank you