yuuho.wiki

カオスの欠片を集めて知恵の泉を作る

ユーザ用ツール

サイト用ツール


tips:cuda:start

文書の過去の版を表示しています。


CUDA

基本事項

  • GPU 上で動く関数には __global__ または __device__ が付いている。
  • __global__ は C++ から直接呼び出す用の関数で
  • __device____global__ の関数内から呼び出される関数だと思う。
  • cudaMalloc で確保した GPUメモリに cudaMemcpy でCPU側からデータを移して
  • CUDAの関数を呼び出して実行されたら cudaMemcpy でCPU側のメモリにデータを移す。
  • CUDAの関数(カーネル)は関数名の後に <<<grid, threads>>> というテンプレート的な表記のものが付くのでわかりやすい。

CUDAにおける配列

Grid の中には複数の Block があり、Block の中には複数の thread がある。
画素の座標を知るには?

  • dim3 gridShape(a, b, c); : 3次元テンソル
  • dim3 blockShape(d, e, f); : 3次元テンソル
  • として、<<<gridShape, blockShape>>> で呼び出すとよい。
  • 全体としては 6次元テンソルのように見える。

例)

サイズ 実際の値 インデックス名 インデックス
gridDim.x 131 blockIdx.x i
gridDim.y 131 blockIdx.y j
gridDim.z 1 blockIdx.z
blockDim.x 256 threadIdx.x k
blockDim.y 1 threadIdx.y
blockDim.z 1 threadIdx.z

グローバルな ID は次のように計算すれば良い。

int id = (gridDim.y*blockDim.x)*blockIdx.x + (blockDim.x)*blockIdx.y + threadIdx.x;
// id = (131*256)*i + (256)*j + k ;

物理構造とデータモデル

単位 説明
GPC Graphics Processing Cluster, has N x SM
SM Streaming Multi-Processor, has N x CUDA Core
CUDA Core thread に対応(?)

一つの Block は一つの SM に割り当てられる。
同じ Block 内のスレッドでは共有メモリを共有できるらしい。
共有メモリはデバイスメモリよりも高速にアクセス可能。

例) 1080ti は 6[GPC/GPU], 5[SM/GPC], 128[CUDACo./SM]
ただし 30SM のうちの 2 つの SM が無効化されている。

頻出データ構造/関数

  • dim3
  • cudaMalloc
  • cudaMemcpy
    • cudaMemcpyHostToDevice
    • cudaMemcpyDeviceToHost
  • cudaFree
  • cudaGetDeviceCount
  • cudaSetDevice

同期の保証

  • cudaMemcpy はカーネル処理の終了がされたことを保証する。
  • カーネルを連続して実行した場合、thread内では順序が保証されていそう。
tips/cuda/start.1631869227.txt.gz · 最終更新: 2021/09/17 09:00 by yuuho