资源
UnboundedAllocator
一种使用动态主机或设备内存分配且没有上限的分配器。此分配器不接受任何用户指定的参数。此内存池易于使用,建议用于初始原型设计。一旦应用程序正常工作,切换到 BlockMemoryPool
可能会有助于提供额外的性能。
BlockMemoryPool
这是一个内存池,它提供用户指定数量的、大小相等的内存块。使用此内存池提供了一种一次性分配内存块并在每次后续调用操作符的 compute
方法时重用这些块的方法。这节省了相对于每次调用 compute
时再次分配内存的开销。对于接受内存池参数的内置操作符,其 API 文档字符串中有一个名为“设备内存要求”的部分,其中提供了关于与此内存池一起使用的 num_blocks
和 block_size
的指导。
storage_type
参数可以设置为确定操作符使用的内存存储类型。它可以是 0,表示页锁定主机内存(使用cudaMallocHost
分配),1 表示设备内存(使用cudaMalloc
分配),或 2 表示系统内存(使用 C++new
分配)。block_size
参数确定内存池中单个块的大小,以字节为单位。对此分配器发出的任何分配请求都必须适合此块大小。num_blocks
参数控制内存池中分配的块的总数。dev_id
参数是一个可选参数,可用于指定将在其上创建内存池的 CUDA 设备的 ID。
RMMAllocator
此分配器提供一对内存池(一个是 CUDA 设备内存池,另一个对应于锁页主机内存)。底层实现基于 RAPIDS 内存管理器 (RMM),并使用一对 rmm::mr::pool_memory_resource
资源类型(设备内存池是 rmm::mr::cuda_memory_resource
,主机池是 rmm::mr::pinned_memory_resource
)。与 BlockMemoryPool
不同,此分配器可以与需要能够分配主机和设备内存的操作符(如 VideoStreamReplayerOp
)一起使用。它不使用固定块大小,而仅使用初始内存大小进行分配,以及池可以扩展到的最大大小。
device_memory_initial_size
参数指定设备 (GPU) 内存池的初始大小。这是一个可选参数,在 aarch64 上默认为 8 MB,在 x86_64 上默认为 16 MB。有关用于指定值的格式,请参阅下面的注释。device_memory_max_size
参数指定设备 (GPU) 内存池的最大大小,单位为 MiB。这是一个可选参数,默认为device_memory_initial_size
值的两倍。有关用于指定值的格式,请参阅下面的注释。host_memory_initial_size
参数指定设备 (GPU) 内存池的初始大小,单位为 MiB。这是一个可选参数,在 aarch64 上默认为 8 MB,在 x86_64 上默认为 16 MB。有关用于指定值的格式,请参阅下面的注释。host_memory_max_size
参数指定设备 (GPU) 内存池的最大大小,单位为 MiB。这是一个可选参数,默认为host_memory_initial_size
值的两倍。有关用于指定值的格式,请参阅下面的注释。dev_id
参数是一个可选参数,可用于指定将在其上创建内存池的 GPU 设备 ID(整数形式)。
内存参数的值,例如 device_memory_initial_size
,必须以字符串形式指定,其中包含一个非负整数值,后跟一个表示单位的后缀。支持的单位为 B、KB、MB、GB 和 TB,其中值是 1024 字节的幂(例如 MB = 1024 * 1024 字节)。有效单位的示例包括“512MB”、“256 KB”、“1 GB”。如果指定了浮点数,则小数部分将被截断(即,该值向下舍入到最接近的整数)。
CudaStreamPool
此分配器创建一个 CUDA 流池。
stream_flags
参数指定发送到 cudaStreamCreateWithPriority 的标志,用于在池中创建流。stream_priority
参数指定发送到 cudaStreamCreateWithPriority 的优先级,用于在池中创建流。较低的值具有较高的优先级。reserved_size
参数指定初始化时在池中创建的 CUDA 流的初始数量。max_size
参数是一个可选参数,可用于指定池中可以存在的 CUDA 流的最大数量。默认值 0 表示池的大小不受限制。dev_id
参数是一个可选参数,可用于指定将在其上创建流池的 CUDA 设备的 ID。
时钟类可以通过 clock
参数提供给 Scheduler
类,以管理时间的流逝。
所有时钟类都提供一组通用的方法,可以在用户应用程序中的运行时使用。
time()
方法返回当前时间,以秒为单位(浮点数)。timestamp()
方法返回当前时间,以纳秒为单位的整数。sleep_for()
方法休眠指定的持续时间,以纳秒为单位。此方法的重载版本允许使用 C++ API 中的std::chrono::duration<Rep, Period>
或 Python API 中的 datetime.timedelta 指定持续时间。sleep_until()
方法休眠到指定的目标时间,以纳秒为单位。
Realtime Clock
RealtimeClock
尊重诸如 PeriodicCondition
等条件的真实持续时间。它是默认的时钟类型,也是用户应用程序中可能使用的类型。
除了上面记录的通用时钟方法之外
此类还有一个
set_time_scale()
方法,可用于动态更改时钟使用的时间刻度。参数
initial_time_offset
可用于在初始化时设置时间的初始偏移量。参数
initial_time_scale
可用于修改时间的比例。例如,比例为 2.0 将导致时间以两倍的速度运行。参数
use_time_since_epoch
使时间相对于 POSIX epoch(initial_time_offset
变为自 epoch 以来的偏移量)。
Manual Clock
ManualClock
压缩时间间隔(例如,PeriodicCondition
立即进行,而不是等待指定的周期)。它主要用于测试/开发期间。
参数 initial_timestamp
控制时钟上的初始时间戳,以纳秒为单位。
通常,用户不需要显式地为 Holoscan SDK 操作符的 IOSpec 端口分配发送器或接收器类。对于操作符之间的连接,将自动使用 DoubleBufferTransmitter
,而对于分布式应用程序中片段之间的连接,将使用 UcxTransmitter
。当启用数据帧流跟踪时,任何 DoubleBufferTransmitter
都将被 AnnotatedDoubleBufferTransmitter
替换,后者还会记录该功能所需的时间戳。
DoubleBufferTransmitter
这是片段内操作符的输出端口使用的发送器类。
UcxTransmitter
这是连接分布式应用程序中片段的操作符的输出端口使用的发送器类。它负责发送 UCX 主动消息并序列化其内容。
通常,用户不需要显式地为 Holoscan SDK 操作符的 IOSpec 端口分配发送器或接收器类。对于操作符之间的连接,将使用 DoubleBufferReceiver
,而对于分布式应用程序中片段之间的连接,将使用 UcxReceiver
。当启用数据帧流跟踪时,任何 DoubleBufferReceiver
都将被 AnnotatedDoubleBufferReceiver
替换,后者还会记录该功能所需的时间戳。
DoubleBufferReceiver
这是片段内操作符的输入端口使用的接收器类。
UcxReceiver
这是连接分布式应用程序中片段的操作符的输入端口使用的接收器类。它负责接收 UCX 主动消息并反序列化其内容。
“系统资源”部分中的组件与系统资源(例如操作符可以使用的 CPU 线程)相关。
ThreadPool
此资源表示一个线程池,可用于将操作符绑定到使用特定的 CPU 线程运行。GreedyScheduler
不支持此功能,因为它是一个单线程调度器,但 EventBasedScheduler
和 MultiThreadScheduler
都支持。与其他资源类型不同,ThreadPool 不应 通过 make_resource
(C++
/Python
) 创建,而应使用专用的 make_thread_pool
(C++
/Python
) 方法。此专用方法是必要的,因为线程池需要其他资源类型不需要的一些额外的初始化逻辑。有关用法,请参阅用户指南中关于配置线程池的部分。
参数
initial_size
指示初始化线程池时要初始化的线程数。