CUDA api 相关
driver api v.s. runtime api
driver api 更为细粒度,例如 runtime 中所有 kernel 初始化时自动 load 且程序运行时保持 load ,driver api 可以只保持当前需要 load 的 module
从用户接口上:
driver api 通常返回 CUresult
runtime api 通常返回 cudaError_t
driver api
主要调研 driver api
api list
memcpy / memset 同步/异步版本 (async)
cuInit(flag) 初始化 driver api,需要最先调用
GPUDirectRRDMAWrites
cuEventRecord : 记录一个 stream 的事件
cuLaunchHostFunc : 在 stream 中 launch 一个 host 函数
data structure
CUmemoryPool
NvSciSync
CUuuid
CUcontext
与线程关联CUdeviceptr
CUexternalSemaphore
stream 等待信号量
每个 context 对应多个线程 ?
每个线程有一个 context 栈 ?
primary context : 每个设备上唯一,与 runtime API 共享
每个线程有一个 context 栈,cuCtxCreate()
将新 context 放入栈顶,cuCtxPopCurrent()
将栈顶 context 取出,并恢复之前的 context。
memory type
unified memory : 不区分 device pointer 和 host pointer
pageable host memory
pinned host memory
device memory
指针是 unique 的,指针类型包含在指针中 ?
cuMemHostAlloc
分配 page-locked memory(pinned memory),可以直接被 device 访问cuMemHostGetDevicePointer
: 返回 pinned memory 的 device 端指针cuMemHostRegister
: 内存段注册为 page lockedcuMemAllocFromPoolAsync
: stream order allocate memory
stream
default stream : cudaStream_t = 0
default stream 两种模式:
- legacy : 所有 stream 与 default stream 同步,使用 cudaStreamNonBlocking 创建 non-blocking stream
- per thread : default stream 不与其他 stream 同步
stream priority
stream ordered memory allocator
stream association :