Mais conteúdo relacionado
Semelhante a 1076: CUDAデバッグ・プロファイリング入門
Semelhante a 1076: CUDAデバッグ・プロファイリング入門 (20)
Mais de NVIDIA Japan (20)
1076: CUDAデバッグ・プロファイリング入門
- 3. CUDA デバッガ
Nsight Visual Studio Edition (NVSE)
Windows 向け。Visual Studioと統合
Nsight Eclipse Edition
Linux・MacOS 向け。EclipseベースのIDE
cuda-gdb
LInux・MacOS向け。コマンドラインデバッガ。
Nsight Eclipse Editionのバックエンド
- 4. NSIGHT VISUAL STUDIO EDITION
Visual Studioに統合されている
VS2013を使用します。
コミュニティエディションが使える!
Professional相当
無償利用も可能。
詳細は、以下をご確認んください。
http://www.microsoft.com/ja-
jp/dev/products/community.aspx
Ver 対応状況
VS2010 deprecated
VS2012 〇
VS2013 〇
VS2015 未対応
- 5. サンプル : PREFIX SUM
Warp Shuffle + シェアードメモリ
Warp (shuffle) Warp (shuffle) Warp (shuffle) Warp (shuffle)
32 32 32 32
Warp (shuffle)
32 64 92 128
Add Add Add
1 … 32 33 … 64 65 … 92 93 … 128
1 … 32 1 … 32 1 … 32 1 … 32
1, 1, 1, 1, … 1, 1, 1, 1, … 1, 1, 1, 1, … 1, 1, 1, 1, …入力
シェアードメモリ
(SM内部にある)
シェアードメモリ
結果
- 12. カーネル中のASSERT
- C言語のassertと同じ
- #define NDEBUGで、
無効化
Nsight Visual Studio Edition
__global__
void kernelAssert() {
assert(0);
}
int main() {
kernelAssert<<<1, 1>>>();
cudaError_t cuerr = cudaDeviceSynchronize();
printf("%s¥n", cudaGetErrorName(cuerr));
}
実演する
- 14. カーネル中のPRINTF
Nsight Visual Studio Edition
__global__ void printfKernel() {
printf("blockIdx(%d, %d, %d) threadIdx(%d, %d, %d)¥n",
blockIdx.x, blockIdx.y, blockIdx.z,
threadIdx.x, threadIdx.y, threadIdx.z);
}
int main() {
dim3 gridDim(2), blockDim(8);
size_t size;
cudaDeviceGetLimit(&size, cudaLimitPrintfFifoSize);
printf("Printf FIFO size : %d¥n", (int)size);
// cudaDeviceSetLimit(cudaLimitPrintfFifoSize, size);
printfKernel<<<gridDim, blockDim>>>();
(略)
- 16. CUDAソースコードのコンパイル
- nvcc : CUDA用のコンパイラ
- 内部でホスト側コンパイラを使用
- デフォルトは、cl.exe(Windows)、g++(Linux)
- --ccbin で(icc, clang)など指定可能
- ホストコンパイラのオプションも受け付ける。
-Xcompiler <ホストコンパイラオプション>
NVCCの構成
18
ソース(*.cu)
ホスト/GPU ソース分割
ホスト
コンパイラ
デバイスコード
コンパイラ
マージ
オブジェクト (*.o)
- 18. 起動・プロジェクトのインポート
起動 : $ nsight
メニューから
File -> New
-> Makefile Project with
Existing Code
Nsight Eclipse Edition プロジェクト設定
- 19. プロジェクトの作成
- Project Name
- プロジェクト名
- Existing Code Location
- 既存のソースコードの場所
- Toochain for indexer Settings
- ソースのインデキサ設定
Nsight Eclipse Edition プロジェクト設定
- 21. 使用するGPUの設定
- Single GPUでのデバッグ (Beta)
Kepler(CC3.5以降)、Maxwellが必要
- GPUのBreak pointでの停止
- ソフトウエアで状態を保存。
- システムがGPUを利用できるようにする。
- ブレーク中に終了すると
フリーズする場合がある。
Nsight Eclipse Edition
- 23. メモリチェッカの有効化
- デバッグ設定 / Debugger ペイン
- “Enable CUDA memcheck”を
チェック
- Software Preemptionは使えない。
(画面を書いていないGPUを使う)
Nsight Eclipse Edition
- 25. CUDA-MEMCHECK
- 機能
memcheck : 範囲チェック、デバイスメモリのリークをチェック
initcheck : 未初期化値へのアクセスをチェック
synccheck : 同期(__syncthreads())の、すべてのスレッド上の発行をチェック
racecheck : シェアードメモリ上でのハザードを検出
- ビルド時に “-lineinfo”を指定しておくこと。
エラーログ中に、エラー発生行が出力されます。
- Windows / Linux / MacOS X上で、使用法は同じ。
- 今日は、Windowsで動作させてみます。 (配布ファイル中に、ログを入れておきます。)
メモリチェックのためのコマンドラインツール
- 29. DEFAULT STREAMでの処理実行
Stream : GPU上の処理を管理するキュー
無指定の場合、Default (NULL) Streamが使用される。
t
Memcpy
Host → Device
Kernel
Memcpy
Device → Host
Default (NULL) Stream
- 37. プロファイラ設定
- Profile CUDA Applicationを選択
- Experiment Configuration
実施する計測を指定する。
今回は”All”を指定。
Nsignt Visual Studio Edition
- 40. アクセスパターン分析
- AoS : Array of Structures
CPU上でのスタイル
構造化・Object志向
サンプル : memoryAccess
- SoA : Structure of Arrays
GPU上でアクセス効率がよい
struct XY {
float x;
float y;
};
XY xyArray[1024];
struct XYArray {
float x[1024];
float y[1024];
};
- 42. アクセスパターンの違い
AoS vs SoA
x y x y
x y x y
1) xをアクセス
2) yをアクセス
x xx x
y y y y
x xx x
y y y y
AoS:
アクセスに抜けがある。効率悪い。
SoA:
アクセスが連続。効率よい。
- 46. ソースコード
- Global IDが、偶数・奇数で分岐
- 最適化されないよう、メモリフェンス
(__threadfence_block())を、入れてあります
分岐の解析
__global__
void divergentExecutionKernel(float *dMem) {
int gid =
blockDim.x * blockIdx.x + threadIdx.x;
float angle =
float(gid % 360) * float(M_PI / 180.f);
if (gid % 2 == 0) {
dMem[gid] = __sinf(angle);
__threadfence_block();
}
else {
dMem[gid] = __cosf(angle);
}
}