6.21. 流内存操作

本节介绍底层 CUDA 驱动程序应用程序编程接口的流内存操作。

CU_STREAM_WAIT_VALUE_NOR 标志的支持可以使用 CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_WAIT_VALUE_NOR_V2 进行查询。

cuStreamWriteValue64()cuStreamWaitValue64() 函数以及 CU_STREAM_MEM_OP_WAIT_VALUE_64CU_STREAM_MEM_OP_WRITE_VALUE_64 标志的支持可以使用 CU_DEVICE_ATTRIBUTE_CAN_USE_64_BIT_STREAM_MEM_OPS 进行查询。

CU_STREAM_WAIT_VALUE_FLUSHCU_STREAM_MEM_OP_FLUSH_REMOTE_WRITES 的支持需要专用的平台硬件功能,并且可以使用 cuDeviceGetAttribute()CU_DEVICE_ATTRIBUTE_CAN_FLUSH_REMOTE_WRITES 进行查询。

请注意,作为参数传递给这些操作的所有内存指针都是设备指针。在必要时,应获取设备指针,例如使用 cuMemHostGetDevicePointer()

这些操作均不接受指向托管内存缓冲区(cuMemAllocManaged)的指针。

注意

警告:不当使用这些 API 可能会导致应用程序死锁。通过这些 API 建立的同步顺序对 CUDA 不可见。即使间接通过这些 API 排序的 CUDA 任务也应该使用 CUDA 可见的依赖项(如事件)来表达该顺序。这确保调度器不会以不正确的顺序串行化它们。

函数

CUresult cuStreamBatchMemOp ( CUstream stream, unsigned int  count, CUstreamBatchMemOpParams* paramArray, unsigned int  flags )
通过内存操作同步流的批量操作。
CUresult cuStreamWaitValue32 ( CUstream stream, CUdeviceptr addr, cuuint32_t value, unsigned int  flags )
等待内存位置。
CUresult cuStreamWaitValue64 ( CUstream stream, CUdeviceptr addr, cuuint64_t value, unsigned int  flags )
等待内存位置。
CUresult cuStreamWriteValue32 ( CUstream stream, CUdeviceptr addr, cuuint32_t value, unsigned int  flags )
向内存写入值。
CUresult cuStreamWriteValue64 ( CUstream stream, CUdeviceptr addr, cuuint64_t value, unsigned int  flags )
向内存写入值。

函数

CUresult cuStreamBatchMemOp ( CUstream stream, unsigned int  count, CUstreamBatchMemOpParams* paramArray, unsigned int  flags )
通过内存操作同步流的批量操作。
参数
stream
将操作入队的流。
count
数组中操作的数量。必须小于 256。
paramArray
各个操作的类型和参数。
flags
保留供将来扩展;必须为 0。
描述

这是 cuStreamWaitValue32()cuStreamWriteValue32() 的批量版本。与在单独的 API 调用中将操作添加到流相比,批量操作可以避免 API 调用和设备执行中的一些性能开销。操作按照它们在数组中出现的顺序入队。

有关完整支持的操作集,请参阅 CUstreamBatchMemOpType,有关特定操作的详细信息,请参阅 cuStreamWaitValue32()cuStreamWaitValue64()cuStreamWriteValue32()cuStreamWriteValue64()

有关查询对特定操作的支持的详细信息,请参阅相关 API。

注意

警告:不当使用此 API 可能会导致应用程序死锁。通过此 API 建立的同步顺序对 CUDA 不可见。即使间接通过此 API 排序的 CUDA 任务也应该使用 CUDA 可见的依赖项(如事件)来表达该顺序。这确保调度器不会以不正确的顺序串行化它们。有关更多信息,请参阅编程指南中的“流内存操作”章节(https://docs.nvda.net.cn/cuda/cuda-c-programming-guide/index.html)。

注意

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

另请参阅

cuStreamWaitValue32, cuStreamWaitValue64, cuStreamWriteValue32, cuStreamWriteValue64, cuMemHostRegister

CUresult cuStreamWaitValue32 ( CUstream stream, CUdeviceptr addr, cuuint32_t value, unsigned int  flags )
等待内存位置。
参数
stream
要在其内存位置上同步的流。
addr
要等待的内存位置。
value
要与内存位置进行比较的值。
flags
请参阅 CUstreamWaitValue_flags
描述

在给定的内存位置上对流进行同步排队。在该操作之后排序的工作将阻塞,直到满足内存上的给定条件。默认情况下,条件是等待 (int32_t)(*addr - value) >= 0,即循环大于等于。其他条件类型可以通过以下方式指定flags.

如果内存是通过 cuMemHostRegister() 注册的,则设备指针应通过 cuMemHostGetDevicePointer() 获取。此函数不能与托管内存 (cuMemAllocManaged) 一起使用。

可以使用 cuDeviceGetAttribute() 和 CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_WAIT_VALUE_NOR_V2 查询对 CU_STREAM_WAIT_VALUE_NOR 的支持。

注意

警告:不当使用此 API 可能会导致应用程序死锁。通过此 API 建立的同步顺序对 CUDA 不可见。即使间接通过此 API 排序的 CUDA 任务也应该使用 CUDA 可见的依赖项(如事件)来表达该顺序。这确保调度器不会以不正确的顺序串行化它们。

注意

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

另请参阅

cuStreamWaitValue64, cuStreamWriteValue32, cuStreamWriteValue64, cuStreamBatchMemOp, cuMemHostRegister, cuStreamWaitEvent

CUresult cuStreamWaitValue64 ( CUstream stream, CUdeviceptr addr, cuuint64_t value, unsigned int  flags )
等待内存位置。
参数
stream
要在其内存位置上同步的流。
addr
要等待的内存位置。
value
要与内存位置进行比较的值。
flags
请参阅 CUstreamWaitValue_flags
描述

在给定的内存位置上对流进行同步排队。在该操作之后排序的工作将阻塞,直到满足内存上的给定条件。默认情况下,条件是等待 (int64_t)(*addr - value) >= 0,即循环大于等于。其他条件类型可以通过以下方式指定flags.

如果内存是通过 cuMemHostRegister() 注册的,则设备指针应通过 cuMemHostGetDevicePointer() 获取。

可以使用 cuDeviceGetAttribute()CU_DEVICE_ATTRIBUTE_CAN_USE_64_BIT_STREAM_MEM_OPS 查询对此功能的支持。

注意

警告:不当使用此 API 可能会导致应用程序死锁。通过此 API 建立的同步顺序对 CUDA 不可见。即使间接通过此 API 排序的 CUDA 任务也应该使用 CUDA 可见的依赖项(如事件)来表达该顺序。这确保调度器不会以不正确的顺序串行化它们。

注意

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

另请参阅

cuStreamWaitValue32, cuStreamWriteValue32, cuStreamWriteValue64, cuStreamBatchMemOp, cuMemHostRegister, cuStreamWaitEvent

CUresult cuStreamWriteValue32 ( CUstream stream, CUdeviceptr addr, cuuint32_t value, unsigned int  flags )
向内存写入值。
参数
stream
在其中执行写入的流。
addr
要写入的设备地址。
value
要写入的值。
flags
请参阅 CUstreamWriteValue_flags
描述

向内存写入值。

如果内存是通过 cuMemHostRegister() 注册的,则设备指针应通过 cuMemHostGetDevicePointer() 获取。此函数不能与托管内存 (cuMemAllocManaged) 一起使用。

注意

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

另请参阅

cuStreamWriteValue64, cuStreamWaitValue32, cuStreamWaitValue64, cuStreamBatchMemOp, cuMemHostRegister, cuEventRecord

CUresult cuStreamWriteValue64 ( CUstream stream, CUdeviceptr addr, cuuint64_t value, unsigned int  flags )
向内存写入值。
参数
stream
在其中执行写入的流。
addr
要写入的设备地址。
value
要写入的值。
flags
请参阅 CUstreamWriteValue_flags
描述

向内存写入值。

如果内存是通过 cuMemHostRegister() 注册的,则设备指针应通过 cuMemHostGetDevicePointer() 获取。

可以使用 cuDeviceGetAttribute()CU_DEVICE_ATTRIBUTE_CAN_USE_64_BIT_STREAM_MEM_OPS 查询对此功能的支持。

注意

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

另请参阅

cuStreamWriteValue32, cuStreamWaitValue32, cuStreamWaitValue64, cuStreamBatchMemOp, cuMemHostRegister, cuEventRecord