6.20. 外部资源互操作性

本节介绍低级别 CUDA 驱动程序应用程序编程接口的外部资源互操作性功能。

函数

CUresult cuDestroyExternalMemory ( CUexternalMemory extMem )
销毁外部内存对象。
CUresult cuDestroyExternalSemaphore ( CUexternalSemaphore extSem )
销毁外部信号量。
CUresult cuExternalMemoryGetMappedBuffer ( CUdeviceptr* devPtr, CUexternalMemory extMem, const CUDA_EXTERNAL_MEMORY_BUFFER_DESC* bufferDesc )
将缓冲区映射到导入的内存对象。
CUresult cuExternalMemoryGetMappedMipmappedArray ( CUmipmappedArray* mipmap, CUexternalMemory extMem, const CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC* mipmapDesc )
将 CUDA mipmapped 数组映射到外部内存对象。
CUresult cuImportExternalMemory ( CUexternalMemory* extMem_out, const CUDA_EXTERNAL_MEMORY_HANDLE_DESC* memHandleDesc )
导入外部内存对象。
CUresult cuImportExternalSemaphore ( CUexternalSemaphore* extSem_out, const CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC* semHandleDesc )
导入外部信号量。
CUresult cuSignalExternalSemaphoresAsync ( const CUexternalSemaphore* extSemArray, const CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS* paramsArray, unsigned int  numExtSems, CUstream stream )
发出信号通知一组外部信号量对象。
CUresult cuWaitExternalSemaphoresAsync ( const CUexternalSemaphore* extSemArray, const CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS* paramsArray, unsigned int  numExtSems, CUstream stream )
等待一组外部信号量对象。

函数

CUresult cuDestroyExternalMemory ( CUexternalMemory extMem )
销毁外部内存对象。
参数
extMem
- 要销毁的外部内存对象
描述

销毁指定的外部内存对象。任何已映射到此对象的现有缓冲区和 CUDA mipmapped 数组都必须停止使用,并且必须分别使用 cuMemFreecuMipmappedArrayDestroy 显式释放。

注意

请注意,此函数也可能返回先前异步启动的错误代码。

另请参阅

cuImportExternalMemory, cuExternalMemoryGetMappedBuffer, cuExternalMemoryGetMappedMipmappedArray

CUresult cuDestroyExternalSemaphore ( CUexternalSemaphore extSem )
销毁外部信号量。
参数
extSem
- 要销毁的外部信号量
描述

销毁外部信号量对象并释放对底层资源的任何引用。在销毁信号量之前,任何未完成的信号或等待都必须已完成。

注意

请注意,此函数也可能返回先前异步启动的错误代码。

另请参阅

cuImportExternalSemaphore, cuSignalExternalSemaphoresAsync, cuWaitExternalSemaphoresAsync

CUresult cuExternalMemoryGetMappedBuffer ( CUdeviceptr* devPtr, CUexternalMemory extMem, const CUDA_EXTERNAL_MEMORY_BUFFER_DESC* bufferDesc )
将缓冲区映射到导入的内存对象。
参数
devPtr
- 返回的缓冲区设备指针
extMem
- 外部内存对象的句柄
bufferDesc
- 缓冲区描述符
描述

将缓冲区映射到导入的内存对象,并在 中返回设备指针devPtr.

要映射的缓冲区的属性必须在 中描述bufferDesc。CUDA_EXTERNAL_MEMORY_BUFFER_DESC 结构定义如下

‎        typedef struct CUDA_EXTERNAL_MEMORY_BUFFER_DESC_st {
                  unsigned long long offset;
                  unsigned long long size;
                  unsigned int flags;
              } CUDA_EXTERNAL_MEMORY_BUFFER_DESC;

其中 CUDA_EXTERNAL_MEMORY_BUFFER_DESC::offset 是缓冲区基址在内存对象中的偏移量。CUDA_EXTERNAL_MEMORY_BUFFER_DESC::size 是缓冲区的大小。CUDA_EXTERNAL_MEMORY_BUFFER_DESC::flags 必须为零。

偏移量和大小必须适当对齐,以符合外部 API 的要求。映射范围重叠的两个缓冲区可能会或可能不会为重叠部分返回相同的虚拟地址。在这种情况下,应用程序必须确保从 GPU 对该区域的所有访问都是易失的。否则,通过一个地址进行的写入不能保证通过另一个地址可见,即使它们是由同一线程发出的。建议应用程序映射组合范围,而不是映射单独的缓冲区,然后将适当的偏移量应用于返回的指针以派生各个缓冲区。

返回的指针devPtr必须使用 cuMemFree 释放。

注意

请注意,此函数也可能返回先前异步启动的错误代码。

另请参阅

cuImportExternalMemory, cuDestroyExternalMemory, cuExternalMemoryGetMappedMipmappedArray

CUresult cuExternalMemoryGetMappedMipmappedArray ( CUmipmappedArray* mipmap, CUexternalMemory extMem, const CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC* mipmapDesc )
将 CUDA mipmapped 数组映射到外部内存对象。
参数
mipmap
- 返回的 CUDA mipmapped 数组
extMem
- 外部内存对象的句柄
mipmapDesc
- CUDA 数组描述符
描述

将 CUDA mipmapped 数组映射到外部对象,并在 中返回其句柄mipmap.

要映射的 CUDA mipmapped 数组的属性必须在 中描述mipmapDesc。结构 CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC 定义如下

‎        typedef struct CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC_st {
                  unsigned long long offset;
                  CUDA_ARRAY3D_DESCRIPTOR arrayDesc;
                  unsigned int numLevels;
              } CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC;

其中 CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC::offset 是 mipmap 链的基准级别在内存对象中的偏移量。CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC::arrayDesc 描述了 mipmap 链的基准级别的格式、维度和类型。有关这些参数的更多详细信息,请参阅 cuMipmappedArrayCreate 的文档。请注意,如果 mipmapped 数组在图形 API 中绑定为颜色目标,则必须在 CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC::arrayDesc::Flags 中指定标志 CUDA_ARRAY3D_COLOR_ATTACHMENTCUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC::numLevels 指定 mipmap 链中的级别总数。

如果extMem是从类型为 CU_EXTERNAL_MEMORY_HANDLE_TYPE_NVSCIBUF 的句柄导入的,则 CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC::numLevels 必须等于 1。

返回的 CUDA mipmapped 数组必须使用 cuMipmappedArrayDestroy 释放。

注意

请注意,此函数也可能返回先前异步启动的错误代码。

另请参阅

cuImportExternalMemory, cuDestroyExternalMemory, cuExternalMemoryGetMappedBuffer

CUresult cuImportExternalMemory ( CUexternalMemory* extMem_out, const CUDA_EXTERNAL_MEMORY_HANDLE_DESC* memHandleDesc )
导入外部内存对象。
参数
extMem_out
- 返回的外部内存对象句柄
memHandleDesc
- 内存导入句柄描述符
描述

导入外部分配的内存对象,并在 中返回该对象的句柄extMem_out.

要导入的句柄的属性必须在 中描述memHandleDesc。CUDA_EXTERNAL_MEMORY_HANDLE_DESC 结构定义如下

‎        typedef struct CUDA_EXTERNAL_MEMORY_HANDLE_DESC_st {
                  CUexternalMemoryHandleType type;
                  union {
                      int fd;
                      struct {
                          void *handle;
                          const void *name;
                      } win32;
                      const void *nvSciBufObject;
                  } handle;
                  unsigned long long size;
                  unsigned int flags;
              } CUDA_EXTERNAL_MEMORY_HANDLE_DESC;

其中 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::type 指定要导入的句柄的类型。CUexternalMemoryHandleType 定义为

‎        typedef enum CUexternalMemoryHandleType_enum {
                  CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD          = 1,
                  CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32       = 2,
                  CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT   = 3,
                  CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP         = 4,
                  CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE     = 5,
                  CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE     = 6,
                  CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE_KMT = 7,
                  CU_EXTERNAL_MEMORY_HANDLE_TYPE_NVSCIBUF           = 8,
              } CUexternalMemoryHandleType;

如果 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::typeCU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD,则 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::fd 必须是引用内存对象的有效文件描述符。文件描述符的所有权在句柄成功导入后转移到 CUDA 驱动程序。导入后对文件描述符执行任何操作都会导致未定义的行为。

如果 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::typeCU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32,则 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::handle 和 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::name 中必须只有一个不为 NULL。如果 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::handle 不为 NULL,则它必须表示引用内存对象的有效共享 NT 句柄。此句柄的所有权在导入操作后不会转移到 CUDA,因此应用程序必须使用适当的系统调用释放该句柄。如果 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::name 不为 NULL,则它必须指向引用内存对象的以 NULL 结尾的 UTF-16 字符数组。

如果 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::typeCU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT,则 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::handle 必须为非 NULL,而 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::name 必须为 NULL。指定的句柄必须是全局共享的 KMT 句柄。此句柄不持有对底层对象的引用,因此当对内存对象的所有引用都被销毁时,它将无效。

如果 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::typeCU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP,则 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::handle 和 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::name 中必须只有一个不为 NULL。如果 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::handle 不为 NULL,则它必须表示 ID3D12Device::CreateSharedHandle 在引用 ID3D12Heap 对象时返回的有效共享 NT 句柄。此句柄持有对底层对象的引用。如果 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::name 不为 NULL,则它必须指向引用 ID3D12Heap 对象的以 NULL 结尾的 UTF-16 字符数组。

如果 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::typeCU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE,则 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::handle 和 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::name 中必须只有一个不为 NULL。如果 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::handle 不为 NULL,则它必须表示 ID3D12Device::CreateSharedHandle 在引用 ID3D12Resource 对象时返回的有效共享 NT 句柄。此句柄持有对底层对象的引用。如果 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::name 不为 NULL,则它必须指向引用 ID3D12Resource 对象的以 NULL 结尾的 UTF-16 字符数组。

如果 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::typeCU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE,则 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::handle 必须表示 IDXGIResource1::CreateSharedHandle 在引用 ID3D11Resource 对象时返回的有效共享 NT 句柄。如果 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::name 不为 NULL,则它必须指向引用 ID3D11Resource 对象的以 NULL 结尾的 UTF-16 字符数组。

如果 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::typeCU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE_KMT,则 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::handle 必须表示 IDXGIResource::GetSharedHandle 在引用 ID3D11Resource 对象时返回的有效共享 KMT 句柄,并且 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::name 必须为 NULL。

如果 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::typeCU_EXTERNAL_MEMORY_HANDLE_TYPE_NVSCIBUF,则 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::nvSciBufObject 必须为非 NULL,并且引用有效的 NvSciBuf 对象。如果导入到 CUDA 中的 NvSciBuf 对象也由其他驱动程序映射,则应用程序必须使用 cuWaitExternalSemaphoresAsynccuSignalExternalSemaphoresAsync 作为适当的屏障,以保持 CUDA 与其他驱动程序之间的一致性。有关内存同步,请参阅 CUDA_EXTERNAL_SEMAPHORE_SIGNAL_SKIP_NVSCIBUF_MEMSYNCCUDA_EXTERNAL_SEMAPHORE_WAIT_SKIP_NVSCIBUF_MEMSYNC

内存对象的大小必须在 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::size 中指定。

CUDA_EXTERNAL_MEMORY_DEDICATEDCUDA_EXTERNAL_MEMORY_HANDLE_DESC::flags 中指定标志表示该资源是专用资源。专用资源的定义不在此扩展的范围之内。如果 CUDA_EXTERNAL_MEMORY_HANDLE_DESC::type 是以下类型之一,则必须设置此标志:CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCECU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCECU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE_KMT

注意
  • 请注意,此函数也可能返回先前异步启动的错误代码。

  • 如果导入到 CUDA 中的 Vulkan 内存映射到 CPU 上,则应用程序必须使用 vkInvalidateMappedMemoryRanges/vkFlushMappedMemoryRanges 以及适当的 Vulkan 管线屏障来维护 CPU 和 GPU 之间的一致性。有关这些 API 的更多信息,请参阅 Vulkan 规范中的“Synchronization and Cache Control”章节。

另请参阅

cuDestroyExternalMemory, cuExternalMemoryGetMappedBuffer, cuExternalMemoryGetMappedMipmappedArray

CUresult cuImportExternalSemaphore ( CUexternalSemaphore* extSem_out, const CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC* semHandleDesc )
导入外部信号量。
参数
extSem_out
- 返回的外部信号量句柄
semHandleDesc
- 信号量导入句柄描述符
描述

导入外部分配的同步对象,并在 extSem_out 中返回其句柄。extSem_out.

要导入的句柄的属性必须在 中描述semHandleDescCUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC 定义如下

‎        typedef struct CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_st {
                  CUexternalSemaphoreHandleType type;
                  union {
                      int fd;
                      struct {
                          void *handle;
                          const void *name;
                      } win32;
                      const void* NvSciSyncObj;
                  } handle;
                  unsigned int flags;
              } CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC;

其中 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::type 指定要导入的句柄类型。CUexternalSemaphoreHandleType 定义为

‎        typedef enum CUexternalSemaphoreHandleType_enum {
                  CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD                = 1,
                  CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32             = 2,
                  CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT         = 3,
                  CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE              = 4,
                  CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCE              = 5,
                  CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_NVSCISYNC                = 6,
                  CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEX        = 7,
                  CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEX_KMT    = 8,
                  CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TIMELINE_SEMAPHORE_FD    = 9,
                  CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TIMELINE_SEMAPHORE_WIN32 = 10
              } CUexternalSemaphoreHandleType;

如果 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::typeCU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD,则 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::fd 必须是引用同步对象的有效文件描述符。成功导入句柄后,文件描述符的所有权将转移到 CUDA 驱动程序。导入后对文件描述符执行任何操作都会导致未定义的行为。

如果 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::typeCU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32,则 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::handle 和 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::name 必须有一个不为 NULL。如果 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::handle 不为 NULL,则它必须表示引用同步对象的有效共享 NT 句柄。导入操作后,此句柄的所有权不会转移到 CUDA,因此应用程序必须使用适当的系统调用释放该句柄。如果 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::name 不为 NULL,则它必须命名一个有效的同步对象。

如果 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::typeCU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT,则 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::handle 必须为非 NULL,并且 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::name 必须为 NULL。指定的句柄必须是全局共享的 KMT 句柄。此句柄不持有对底层对象的引用,因此当销毁对同步对象的所有引用时,它将变为无效。

如果 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::typeCU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE,则 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::handle 和 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::name 必须有一个不为 NULL。如果 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::handle 不为 NULL,则它必须表示 ID3D12Device::CreateSharedHandle 返回的有效共享 NT 句柄,该句柄引用 ID3D12Fence 对象。此句柄持有对底层对象的引用。如果 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::name 不为 NULL,则它必须命名一个引用有效 ID3D12Fence 对象的有效同步对象。

如果 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::typeCU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCE,则 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::handle 表示 ID3D11Fence::CreateSharedHandle 返回的有效共享 NT 句柄。如果 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::name 不为 NULL,则它必须命名一个引用有效 ID3D11Fence 对象的有效同步对象。

如果 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::typeCU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_NVSCISYNC,则 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::nvSciSyncObj 表示有效的 NvSciSyncObj。

如果 CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEX,则 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::handle 表示 IDXGIResource1::CreateSharedHandle 返回的有效共享 NT 句柄,该句柄引用 IDXGIKeyedMutex 对象。如果 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::name 不为 NULL,则它必须命名一个引用有效 IDXGIKeyedMutex 对象的有效同步对象。

如果 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::typeCU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEX_KMT,则 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::handle 表示 IDXGIResource::GetSharedHandle 返回的有效共享 KMT 句柄,该句柄引用 IDXGIKeyedMutex 对象,并且 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::name 必须为 NULL。

如果 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::typeCU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TIMELINE_SEMAPHORE_FD,则 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::fd 必须是引用同步对象的有效文件描述符。成功导入句柄后,文件描述符的所有权将转移到 CUDA 驱动程序。导入后对文件描述符执行任何操作都会导致未定义的行为。

如果 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::typeCU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TIMELINE_SEMAPHORE_WIN32,则 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::handle 和 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::name 必须有一个不为 NULL。如果 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::handle 不为 NULL,则它必须表示引用同步对象的有效共享 NT 句柄。导入操作后,此句柄的所有权不会转移到 CUDA,因此应用程序必须使用适当的系统调用释放该句柄。如果 CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::name 不为 NULL,则它必须命名一个有效的同步对象。

注意

请注意,此函数也可能返回先前异步启动的错误代码。

另请参阅

cuDestroyExternalSemaphore, cuSignalExternalSemaphoresAsync, cuWaitExternalSemaphoresAsync

CUresult cuSignalExternalSemaphoresAsync ( const CUexternalSemaphore* extSemArray, const CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS* paramsArray, unsigned int  numExtSems, CUstream stream )
发出对一组外部信号量对象的信号。
参数
extSemArray
- 要发出信号的一组外部信号量
paramsArray
- 信号量参数数组
numExtSems
- 要发出信号的信号量数量
stream
- 将信号操作排队的流
描述

在指定的流中,将信号操作排队到一组外部分配的信号量对象上。当流中的所有先前操作完成后,将执行这些操作。

发出信号量的确切语义取决于对象的类型。

如果信号量对象是以下类型中的任何一种:CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FDCU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT,则发出信号量将使其设置为已发出信号状态。

如果信号量对象是以下类型中的任何一种:CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCECU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCECU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TIMELINE_SEMAPHORE_FDCU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TIMELINE_SEMAPHORE_WIN32,则信号量将设置为 CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS::params::fence::value 中指定的值。

如果信号量对象的类型为 CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_NVSCISYNC,则此 API 将 CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS::params::nvSciSync::fence 设置为可供同一 NvSciSync 对象的后续等待者使用的值,以便对当前在 stream 中提交的操作进行排序。stream这样的更新将覆盖 CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS::params::nvSciSync::fence 的先前内容。默认情况下,对这样的外部信号量对象发出信号会导致对所有导入为 CU_EXTERNAL_MEMORY_HANDLE_TYPE_NVSCIBUF 的外部内存对象执行适当的内存同步操作。这确保了同一组 NvSciBuf 内存对象的其他导入器进行的任何后续访问都是一致的。可以通过指定标志 CUDA_EXTERNAL_SEMAPHORE_SIGNAL_SKIP_NVSCIBUF_MEMSYNC 来跳过这些操作,当不需要数据一致性时,可以使用该标志作为性能优化。但是,在需要数据一致性的情况下指定此标志会导致未定义的行为。此外,对于类型为 CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_NVSCISYNC 的信号量对象,如果用于创建 NvSciSyncObj 的 NvSciSyncAttrList 未在 cuDeviceGetNvSciSyncAttributes 中将标志设置为 CUDA_NVSCISYNC_ATTR_SIGNAL,则此 API 将返回 CUDA_ERROR_NOT_SUPPORTED。与类型为 CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_NVSCISYNC 的信号量对象关联的 NvSciSyncFence 可以是确定性的。为此,用于创建信号量对象的 NvSciSyncAttrList 必须将 NvSciSyncAttrKey_RequireDeterministicFences 键的值设置为 true。确定性栅栏允许用户甚至在排队相应的信号之前,就对信号量对象排队等待。对于这样的信号量对象,CUDA 保证每个信号操作都会将栅栏值递增 '1'。用户应跟踪在信号量对象上排队的信号计数,并相应地插入等待。当从多个流发出此类信号量对象的信号时,由于并发流执行,信号量被发出信号的顺序可能是不确定的。这可能会导致信号量的等待者被错误地解除阻塞。用户应处理这种情况,要么不在不同流中使用启用确定性栅栏支持的同一信号量对象,要么在这些流之间添加显式依赖关系,以便按顺序发出信号量信号。

如果信号量对象是以下类型中的任何一种:CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEXCU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEX_KMT,则将使用 CUDA_EXTERNAL_SEMAPHORE_PARAMS::params::keyedmutex::key 中指定的键释放键控互斥量。

注意

请注意,此函数也可能返回先前异步启动的错误代码。

另请参阅

cuImportExternalSemaphore, cuDestroyExternalSemaphore, cuWaitExternalSemaphoresAsync

CUresult cuWaitExternalSemaphoresAsync ( const CUexternalSemaphore* extSemArray, const CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS* paramsArray, unsigned int  numExtSems, CUstream stream )
等待一组外部信号量对象。
参数
extSemArray
- 要等待的外部信号量
paramsArray
- 信号量参数数组
numExtSems
- 要等待的信号量数量
stream
- 将等待操作排队的流
描述

在指定的流中,将等待操作排队到一组外部分配的信号量对象上。当流中的所有先前操作完成后,将执行这些操作。

等待信号量的确切语义取决于对象的类型。

如果信号量对象是以下类型中的任何一种:CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FDCU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT,则等待信号量将等待直到信号量达到已发出信号状态。然后,信号量将重置为未发出信号状态。因此,对于每个信号操作,只能有一个等待操作。

如果信号量对象是以下类型中的任何一种:CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCECU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCECU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TIMELINE_SEMAPHORE_FDCU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TIMELINE_SEMAPHORE_WIN32,则等待信号量将等待直到信号量的值大于或等于 CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS::params::fence::value。

如果信号量对象的类型为 CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_NVSCISYNC,则等待信号量将等待直到 CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS::params::nvSciSync::fence 被与此信号量对象关联的 NvSciSyncObj 的信号发送者发出信号。默认情况下,等待这样的外部信号量对象会导致对所有导入为 CU_EXTERNAL_MEMORY_HANDLE_TYPE_NVSCIBUF 的外部内存对象执行适当的内存同步操作。这确保了同一组 NvSciBuf 内存对象的其他导入器进行的任何后续访问都是一致的。可以通过指定标志 CUDA_EXTERNAL_SEMAPHORE_WAIT_SKIP_NVSCIBUF_MEMSYNC 来跳过这些操作,当不需要数据一致性时,可以使用该标志作为性能优化。但是,在需要数据一致性的情况下指定此标志会导致未定义的行为。此外,对于类型为 CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_NVSCISYNC 的信号量对象,如果用于创建 NvSciSyncObj 的 NvSciSyncAttrList 未在 cuDeviceGetNvSciSyncAttributes 中将标志设置为 CUDA_NVSCISYNC_ATTR_WAIT,则此 API 将返回 CUDA_ERROR_NOT_SUPPORTED。

如果信号量对象是以下类型中的任何一种:CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEXCU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEX_KMT,则当键控互斥量使用 CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS::params::keyedmutex::key 中指定的键释放时,或者直到 CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS::params::keyedmutex::timeoutMs 指定的超时时间过去,才会获取键控互斥量。超时时间间隔可以是毫秒为单位的有限值,也可以是无限值。如果指定了无限值,则超时永远不会过去。Windows INFINITE 宏必须用于指定无限超时。

注意

请注意,此函数也可能返回先前异步启动的错误代码。

另请参阅

cuImportExternalSemaphore, cuDestroyExternalSemaphore, cuSignalExternalSemaphoresAsync