Cuda
- 1. CUDA
東京工業大学 4年
千葉 滋 研究室
穂積 俊平
1
- 36. 実際のCUDAコード
float *A_d, *B_d, *C_d
cudaMalloc(&A_d,sizeof(float)*N)
cudaMemcpy(A_d,A_h,sizeof(float)*N,hostToDevise)
dim3 Dg(2,1,1) Db(512,1,1)
vec_add<<Dg,Db>>(A_d,B_d,C_d)
36
- 37. 実際のCUDAコード
float *A_d, *B_d, *C_d
cudaMalloc(&A_d,sizeof(float)*N)
cudaMemcpy(A_d,A_h,sizeof(float)*N,hostToDevise)
dim3 Dg(2,1,1) Db(512,1,1)
vec_add<<Dg,Db>>(A_d,B_d,C_d)
4. 結果をデバイスメモリからホストメモリにコピー
37
- 38. 実際のCUDAコード
float *A_d, *B_d, *C_d
cudaMalloc(&A_d,sizeof(float)*N)
cudaMemcpy(A_d,A_h,sizeof(float)*N,hostToDevise)
dim3 Dg(2,1,1) Db(512,1,1)
vec_add<<Dg,Db>>(A_d,B_d,C_d)
cudaMemcpy(C_h,C_d,sizeof(float)*N,deviseToHost)
38
- 39. 実際のCUDAコード
float *A_d, *B_d, *C_d
cudaMalloc(&A_d,sizeof(float)*N)
cudaMemcpy(A_d,A_h,sizeof(float)*N,hostToDevise)
dim3 Dg(2,1,1) Db(512,1,1)
vec_add<<<Dg,Db>>>(A_d,B_d,C_d)
cudaMemcpy(C_h,C_d,sizeof(float)*N,deviseToHost)
dim3って何?
vec_addの中身は?
39
- 43. カーネル関数
__global__ void vec_add(float *A_d, *B_d, *C_d){
int i = blockDim.x*blockIdx.x + threadIdx.x;
C_d[i] = A_d[i] + B_d[i];
}
ビルトイン変数
カーネル関数内で宣言せずに使用できる変数
blockDim : blockの大きさの情報
blockIdx : 何番目のblockを参照しているか
threadIdx : 何番目のthreadを参照しているか
43
- 44. カーネル関数
__global__ void vec_add(float *A_d, *B_d, *C_d){
int i = blockDim.x*blockIdx.x + threadIdx.x;
C_d[i] = A_d[i] + B_d[i];
}
ビルトイン変数
カーネル関数内で宣言せずに使用できる変数
blockDim : blockの大きさの情報
blockIdx : 何番目のblockを参照しているか
threadIdx : 何番目のthreadを参照しているか
各スレッドと配列の要素を結びつけている。
44
- 45. CUDA4.1
• LLVMをベースにしたコンパイラを導入
o 最大で10%の速度アップ
• 自動でパフォーマンス測定を行うVisual Profiler
• CUDA_GDB
o カーネル関数におけるデバッグ、アサート
• CUDA_MEMCHECK
o カーネル関数におけるアウトオブバウンズを検知
45