背景
CUDA Device API だけを使っている.
cuBLAS など CUDA runtime API(e.g. cudaMalloc
) で生成されたポインタ(i.e. void *
)を想定している API を呼びたい.
方法
ありがとうございます.
CUdeviceptr devptr;
void *p = (void *)(uintptr_t)devptr;
で変換します!
逆は,
CUdeviceptr dptr = (CUdeviceptr) (uintptr_t) p;
CUDA の pointer のメモ
CUDeviceptr
はポインタと同じサイズの整数型です.
64bit では typedef unsigned int int
で定義されています.
CUDA runtime API ではインターフェイスは生ポインタですが, 内部的には CUdeviceptr のように整数として処理しています.
(使っていない領域にフラグを入れたりして管理するため)
そのため, address sanitizer のように, ポインタになにか情報を入れたりする仕組みとでは共存できません.