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_64 和 CU_STREAM_MEM_OP_WRITE_VALUE_64 标志的支持可以使用 CU_DEVICE_ATTRIBUTE_CAN_USE_64_BIT_STREAM_MEM_OPS 进行查询。
对 CU_STREAM_WAIT_VALUE_FLUSH 和 CU_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