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 locked
cuMemAllocFromPoolAsync : 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 :

标签: none

添加新评论