# 用語整理 - 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/