# 用語整理
- Host: CPUおよびそのメモリ
- Device: GPUとそのメモリ
- Kernel: GPUデバイスで実行されるコードのこと
- Thread: スレッド。`threadIdx`でブロック内のスレッドのインデックスを取得できる。
- 32スレッドをまとめてWarpという単位でスケジュールしている。Warpごと[[SIMT]]実行。
- Block: Gridは複数のスレッドブロックで構成される。`blockIdx`でグリッド内のブロックのインデックスを取得できる。通常3次元。
- ブロックに属するスレッド間で同期ができる(ブロック外とは協調動作できない)
- sharedメモリを共有できる
- [[Streaming Multiprocessors]]と同義なのか?
- Grid: 1つのkernelによって生成された全てのスレッドをまとめたグループ。通常2次元。
# メモリ
## 階層
- global: Gridにまたがったメモリ。Gridはglobalメモリ空間を共有する。
- shared: ブロックにまたがったメモリ(CPUでいうところのキャッシュ的な)
- sharedとglobalの間にL2キャッシュがある?
## API
- `cudaMalloc`: Deviceのメモリ確保
- `cudaMemcpy`: memcpy. ホスト<->デバイス間でもコピーできる。ブロッキング。
- `cudaMemset`: memset
- `cudaFree`: free. デバイスメモリの解放
# カーネル
実装
```
__global__ void kernel_name(args...) {}
```
呼び出し
```cuda
kernel_name<<<num_block, num_thread_par_block>>>(args...);
```
カーネルの終了を待つには`cudaDeviceSynchronize(void)`が使える
# その他
- `const char* cudaGetErrorString(cudaError_t error)`: `cudaMalloc`などは`cudaError_t`を返す。これをエラーメッセージに変換する。
# ドキュメント
- CUDA Programming Guide: https://docs.nvidia.com/cuda/cuda-programming-guide/