在 GXF 应用程序中使用 Holoscan 操作器、资源和类型
对于熟悉 GXF 开发生态系统的用户,我们提供导出功能,以利用原生 Holoscan 代码作为 GXF 组件,在 GXF 应用程序和 Graph Composer 中执行。
为了简化将原生 C++ Holoscan 操作器包装为 GXF 代码段的方法,请查看以下描述的 wrap_operator_as_gxf_extension
示例。
为了精细地包装多个操作器和资源,请查看以下描述的 wrap_holoscan_as_gxf_extension
示例。
1. 创建兼容的 Holoscan 操作器
本节假设您已熟悉如何创建原生 C++ 操作器。
为了确保与 GXF 代码段的兼容性,建议在 Operator::setup(OperatorSpec& spec)
中将 holoscan::gxf::Entity
指定为输入和输出端口的类型。这在 PingTxNativeOp 和 PingRxNativeOp 的实现中得到了演示。相比之下,内置操作器 PingTxOp 和 PingRxOp 使用不同的规范。请注意,指定类型目前仅用于注释目的,因为 Holoscan SDK 不验证输入和输出类型。但是,此行为将来可能会更改。
有关使用 holoscan::gxf::Entity
的更多详细信息,请参阅关于 GXF 和原生 C++ 操作器之间的互操作性 的文档。
2. 创建包装操作器的 GXF 扩展
为了在 GXF 扩展中将原生操作器包装为 GXF 代码段,我们在 SDK 中提供了 CMake wrap_operator_as_gxf_extension
函数。有关如何包装 PingTxNativeOp
和 PingRxNativeOp
的示例,请参见此处。
它利用了在各自的
CMakeLists.txt
中定义的操作器的 CMake 目标名称 (ping_tx_native_op, ping_rx_native_op)函数参数记录在 WrapOperatorAsGXFExtension.cmake 文件的顶部(忽略下面的实现)。
使用 Holoscan SDK 脚本 generate_extension_uuids.py
为 GXF 包装的组件生成 UUID。
3. 在 GXF 应用程序中使用您包装的操作器
本节假设您熟悉如何创建 GXF 应用程序。
如 gxf_app/CMakeLists.txt
此处 所示,您需要在 create_gxe_application()
中列出以下扩展以使用您包装的代码段
GXF::std
gxf_holoscan_wrapper
为创建的扩展的 CMake 目标名称,由传递给上一节中
wrap_operator_as_gxf_extension
的EXTENSION_TARGET_NAME
参数定义。
代码段类名称(由传递给上一节中 wrap_operator_as_gxf_extension
的 CODELET_NAMESPACE::CODELET_NAME
参数定义)然后可以用作 GXF 应用程序节点中的组件 type
,如示例的 YAML 应用程序定义 中所示,连接两个 ping 操作器。
Holoscan SDK 提供了几个细粒度的 CMake 宏,以使资源和操作器与 GXF 应用程序兼容。
1. 将 holoscan::Resource
包装为 GXF::Component
Holoscan SDK 提供了 CMake generate_gxf_resource_wrapper
函数,用于为 GXF 包装资源。该函数接受 Holoscan SDK Resource
类,并应用包装器模板以生成以下内容
用于为 GXF 包装资源的 C++ 源文件和头文件;
用于将代码编译为共享库的 CMake 构建目标;
在扩展中使用的 GXF C++ 宏源代码。
例如,wrap_holoscan_as_gxf_extension
演示了如何按如下方式包装资源
generate_gxf_resource_wrapper(RESOURCE_HDRS RESOURCE_SRCS EXT_CPP_CONTENT
RESOURCE_CLASS myres::PingVarCustomNativeRes
COMPONENT_NAME PingVarCustomNativeResComponent
COMPONENT_NAMESPACE myexts
COMPONENT_TARGET_NAME gxf_wrapped_ping_variant_custom_native_res_lib
HASH1 0xc4c16b8d6ef94a01
HASH2 0x8014ce5b3e9602b1
INCLUDE_HEADERS ping_variant_custom_native_res.hpp
PUBLIC_DEPENDS ping_variant_custom_native_res
COMPONENT_TARGET_PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
此函数调用在示例构建上下文中的结果如下
生成 C++ 源文件和头文件,用于在 GXF 兼容的
myexts::PingVarCustomNativeResComponent
类中包装myres::PingVarCustomNativeRes
资源。输出 C++ 文件位置存储在RESOURCE_HDRS
和RESOURCE_SRCS
CMake 变量中。定义名为
gxf_wrapped_ping_variant_custom_native_res_lib
的构建目标。运行cmake --build <build-dir> --target <gxf_wrapped_ping_variant_custom_native_res_lib>
将构建 GXF 资源包装器,具体取决于ping_variant_custom_native_res
。将 GXF 工厂宏 C++ 代码片段附加到
EXT_CPP_CONTENT
CMake 变量以供稍后使用。
重复此步骤以包装要包含在扩展中的任何其他资源。
使用 Holoscan SDK 脚本 generate_extension_uuids.py
为 GXF 包装的组件生成 UUID。
2. 将 holoscan::Operator
包装为 GXF::Component
Holoscan SDK 提供了 CMake generate_gxf_operator_wrapper
函数,用于为 GXF 包装操作器。与上面的资源包装器类似,此函数创建 C++ 源文件和头文件,用于包装操作器,以及用于构建操作器包装器的共享库的构建目标。与之前的示例不同,此函数本身不生成 GXF 扩展。
wrap_holoscan_as_gxf_extension
演示了如何按如下方式包装操作器
generate_gxf_operator_wrapper(TX_CODELET_HDRS TX_CODELET_SRCS EXT_CPP_CONTENT
OPERATOR_CLASS "myops::PingVarTxNativeOp"
CODELET_NAME PingVarTxNativeOpCodelet
CODELET_NAMESPACE myexts
HASH1 0x35545ef8ae1541c5
HASH2 0x8aef3c2078fc50b4
CODELET_TARGET_NAME gxf_wrapped_ping_variant_tx_native_op_lib
DESCRIPTION "Ping Tx Native Operator codelet"
INCLUDE_HEADERS ping_variant_tx_native_op.hpp
PUBLIC_DEPENDS ping_variant_tx_native_op
CODELET_TARGET_PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
此函数调用在示例构建上下文中的结果如下
生成 C++ 源文件和头文件,用于在 GXF 兼容的
myexts::PingVarTxNativeOpCodelet
类中包装myop::PingVarTxNativeOp
操作器资源。输出 C++ 文件位置存储在TX_CODELET_HDRS
和TX_CODELET_SRCS
CMake 变量中。定义名为
gxf_wrapped_ping_variant_tx_native_op_lib
的构建目标。运行cmake --build <build-dir> --target <gxf_wrapped_ping_variant_tx_native_op_lib>
将构建 GXF ping 操作器包装器,具体取决于ping_variant_tx_native_op
。将 GXF 工厂宏 C++ 代码片段附加到
EXT_CPP_CONTENT
CMake 变量以供稍后使用。
重复此步骤以包装要包含在扩展中的任何其他操作器。
3. 生成组合的 GXF 扩展
Holoscan SDK 提供了 CMake generate_gxf_extension
函数,用于在 GXF 扩展模板中捆绑包装的组件。该函数接受扩展详细信息和从前面的包装函数调用序列生成的 C++ GXF 函数内容。然后,GXF 组件工厂可以在应用程序运行时实例化在 GXF 扩展中注册的每个组件。
wrap_holoscan_as_gxf_extension
演示了如何按如下方式生成 GXF 扩展
generate_gxf_extension(
EXTENSION_TARGET_NAME gxf_wrapped_ping_variant_ext
EXTENSION_NAME PingVarCustomNativeResExtension
EXTENSION_DESCRIPTION
"Ping Variant Custom Native extension. Includes wrapped Holoscan custom resource and tx/rx operators"
EXTENSION_AUTHOR "NVIDIA"
EXTENSION_VERSION "${holoscan_VERSION}"
EXTENSION_LICENSE "Apache-2.0"
EXTENSION_ID_HASH1 0x2b8381ed5c2740a1
EXTENSION_ID_HASH2 0xbe586c019eaa87be
INCLUDE_HEADERS
${RESOURCE_HDRS}
${TX_CODELET_HDRS}
${RX_CODELET_HDRS}
PUBLIC_DEPENDS
gxf_wrapped_ping_variant_custom_native_res_lib
gxf_wrapped_ping_variant_tx_native_op_lib
gxf_wrapped_ping_variant_rx_native_op_lib
EXTENSION_TARGET_PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
EXT_CPP_CONTENT "${EXT_CPP_CONTENT}"
)
generate_gxf_extension
函数调用生成 CMake 构建目标 gxf_wrapped_ping_variant_ext
以构建 GXF 扩展共享库。生成的扩展可以包含在 GXF 上下文中,以使自定义资源和 Tx/Rx 操作器可用于 GXF 应用程序。
4. 在 GXF 应用程序中使用您包装的组件
本节假设您熟悉如何创建 GXF 应用程序。
使用 Holoscan SDK 包装生成的 GXF 扩展依赖于 Holoscan Wrapper 扩展。在应用程序清单中列出扩展时,请确保按顺序观察依赖项
GXF::std
ucx_holoscan_extension
gxf_holoscan_wrapper
您的自定义包装器扩展名称
查看示例 YAML 应用程序定义,以演示如何在应用程序中将自定义资源用作 tx 操作器的参数。