overall

1 functions

1.1 cudaIpcGetMemHandle

__host__​cudaError_t cudaIpcGetMemHandle ( cudaIpcMemHandle_t* handle, void* devPtr ) 拿到一个device已经allocate完的memory可以跨进程用的handle。

  • handle:用户分配的 cudaIpcMemHandle_t 指针,用于返回生成的句柄。
  • devPtr:指向已分配设备内存的基地址。
  1. 可用于将 cudaMalloc 分配的 GPU 内存导出,供其他进程导入使用。即使内存地址重复(释放后重新分配),新分配也会生成独立的唯一句柄。
  2. IPC 功能仅在支持统一虚拟寻址 (UVA) 的 GPU 上可用
  3. 可通过 cudaDeviceGetAttribute(cudaDevAttrIpcEventSupport) 检查设备是否支持 IPC。

1.2 cudaIpcOpenMemHandle

host__​cudaError_t cudaIpcOpenMemHandle ( void** devPtr, cudaIpcMemHandle_t handle, unsigned int flags ) 从其他进程export出来的gpu memory handle中打开共享内存映射,返回一个当前device process能用的pointer。

  • devPtr:返回的设备指针(指向映射后的共享内存)。
  • handle:由 cudaIpcGetMemHandle() 导出的句柄。
  • flags:必须设为 cudaIpcMemLazyEnablePeerAccess,表示在需要时自动启用设备间访问。
  1. 如果导出方与导入方在不同 GPU 上,函数可自动尝试启用 peer access(等价于 cudaDeviceEnablePeerAccess)是否可访问可用cudaDeviceCanAccessPeer 检查。
  2. 同一设备、同一进程中,每个外部进程的句柄只能被一个上下文打开。
  3. 如果当前上下文已经打开该句柄,会递增引用计数并返回已有的指针。
  4. 打开的共享内存必须通过 cudaIpcCloseMemHandle() 关闭。
  5. 如果导出方在导入方关闭前执行了 cudaFree,行为未定义。
  6. 不保证不同进程获得的映射地址相同。

1.3 cudaIpcCloseMemHandle

__host__​cudaError_t cudaIpcCloseMemHandle ( void* devPtr ) 把上面的 cudaIpcOpenMemHandle 开出来的共享内存映射尝试关掉。该函数会将该映射的引用计数减 1,当引用计数降为 0 时,CUDA 会自动解除该进程对该内存的映射。这不会影响最初在导出进程中分配的内存,也不会影响其他进程中仍然打开的同一映射。

  • devPtr:调用 cudaIpcOpenMemHandle() 时返回的设备指针
  1. 最后一个使用该映射的引用时,CUDA 会释放用于启用 peer access 的资源。
  2. 仅支持 统一虚拟寻址(UVA) 的 GPU