async_tensorrt/ffi/
builder_config.rs

1use cpp::cpp;
2
3use crate::OptimizationProfile;
4
5type Result<T> = std::result::Result<T, crate::error::Error>;
6
7/// Holds properties for configuring a builder to produce an engine.
8///
9/// [TensorRT documentation](https://docs.nvidia.com/deeplearning/tensorrt/api/c_api/classnvinfer1_1_1_i_builder_config.html)
10pub struct BuilderConfig(*mut std::ffi::c_void);
11
12/// Implements [`Send`] for [`BuilderConfig`].
13///
14/// # Safety
15///
16/// The TensorRT API is thread-safe with regards to all operations on [`BuilderConfig`].
17unsafe impl Send for BuilderConfig {}
18
19/// Implements [`Sync`] for [`BuilderConfig`].
20///
21/// # Safety
22///
23/// The TensorRT API is thread-safe with regards to all operations on [`BuilderConfig`].
24unsafe impl Sync for BuilderConfig {}
25
26impl BuilderConfig {
27    /// Wrap internal pointer as [`BuilderConfig`].
28    ///
29    /// # Safety
30    ///
31    /// The pointer must point to a valid `IBuilderConfig` object.
32    pub(crate) fn wrap(internal: *mut std::ffi::c_void) -> Self {
33        Self(internal)
34    }
35
36    /// Set the maximum workspace size.
37    ///
38    /// [TensorRT documentation](https://docs.nvidia.com/deeplearning/tensorrt/api/c_api/classnvinfer1_1_1_i_builder_config.html#a8209999988ab480c60c8a905dfd2654d)
39    ///
40    /// # Arguments
41    ///
42    /// * `size` - The maximum GPU temporary memory which the engine can use at execution time in
43    ///   bytes.
44    pub fn with_max_workspace_size(mut self, size: usize) -> Self {
45        let internal = self.as_mut_ptr();
46        cpp!(unsafe [
47            internal as "void*",
48            size as "std::size_t"
49        ] {
50            ((IBuilderConfig*) internal)->setMemoryPoolLimit(MemoryPoolType::kWORKSPACE, size);
51        });
52        self
53    }
54
55    /// Set the `kSTRICT_TYPES` flag.
56    ///
57    /// [TensorRT documentation for `setFlag`](https://docs.nvidia.com/deeplearning/tensorrt/api/c_api/classnvinfer1_1_1_i_builder_config.html#ac9821504ae7a11769e48b0e62761837e)
58    /// [TensorRT documentation for `kSTRICT_TYPES`](https://docs.nvidia.com/deeplearning/tensorrt/api/c_api/namespacenvinfer1.html#abdc74c40fe7a0c3d05d2caeccfbc29c1ad3ff8ff39475957d8676c2cda337add7)
59    pub fn with_strict_types(mut self) -> Self {
60        let internal = self.as_mut_ptr();
61        cpp!(unsafe [
62            internal as "void*"
63        ] {
64            #if NV_TENSORRT_MAJOR >= 10
65            ((IBuilderConfig*) internal)->setFlag(BuilderFlag::kPREFER_PRECISION_CONSTRAINTS);
66            ((IBuilderConfig*) internal)->setFlag(BuilderFlag::kDIRECT_IO);
67            ((IBuilderConfig*) internal)->setFlag(BuilderFlag::kREJECT_EMPTY_ALGORITHMS);
68            #else
69            ((IBuilderConfig*) internal)->setFlag(BuilderFlag::kSTRICT_TYPES);
70            #endif
71        });
72        self
73    }
74
75    /// Set the `kFP16` flag.
76    ///
77    /// [TensorRT documentation for `setFlag`](https://docs.nvidia.com/deeplearning/tensorrt/api/c_api/classnvinfer1_1_1_i_builder_config.html#ac9821504ae7a11769e48b0e62761837e)
78    /// [TensorRT documentation for `kFP16`](https://docs.nvidia.com/deeplearning/tensorrt/api/c_api/namespacenvinfer1.html#abdc74c40fe7a0c3d05d2caeccfbc29c1a56e4ef5e47a48568bd24c4e0aaabcead)
79    pub fn with_fp16(mut self) -> Self {
80        let internal = self.as_mut_ptr();
81        cpp!(unsafe [
82            internal as "void*"
83        ] {
84            ((IBuilderConfig*) internal)->setFlag(BuilderFlag::kFP16);
85        });
86        self
87    }
88
89    /// Add an optimization profile.
90    ///
91    /// [TensorRT documentation](https://docs.nvidia.com/deeplearning/tensorrt/api/c_api/classnvinfer1_1_1_i_builder_config.html#ab97fa40c85fa8afab65fc2659e38da82)
92    pub fn with_optimization_profile(
93        mut self,
94        optimization_profile: OptimizationProfile,
95    ) -> Result<Self> {
96        self.add_optimization_profile(optimization_profile)?;
97        Ok(self)
98    }
99
100    /// Add an optimization profile.
101    ///
102    /// [TensorRT documentation](https://docs.nvidia.com/deeplearning/tensorrt/api/c_api/classnvinfer1_1_1_i_builder_config.html#ab97fa40c85fa8afab65fc2659e38da82)
103    pub fn add_optimization_profile(
104        &mut self,
105        optimization_profile: OptimizationProfile,
106    ) -> Result<()> {
107        let internal = self.as_mut_ptr();
108        let optimization_profile = optimization_profile.as_ptr();
109        let index = cpp!(unsafe [
110            internal as "void*",
111            optimization_profile as "const IOptimizationProfile*"
112        ] -> i32 as "std::int32_t" {
113           return ((IBuilderConfig*) internal)->addOptimizationProfile(optimization_profile);
114        });
115        if index >= 0 {
116            Ok(())
117        } else {
118            Err(crate::error::last_error())
119        }
120    }
121
122    /// Get internal readonly pointer.
123    #[inline(always)]
124    pub fn as_ptr(&self) -> *const std::ffi::c_void {
125        let BuilderConfig(internal) = *self;
126        internal
127    }
128
129    /// Get internal mutable pointer.
130    #[inline(always)]
131    pub fn as_mut_ptr(&mut self) -> *mut std::ffi::c_void {
132        let BuilderConfig(internal) = *self;
133        internal
134    }
135}
136
137impl Drop for BuilderConfig {
138    fn drop(&mut self) {
139        let internal = self.as_mut_ptr();
140        cpp!(unsafe [
141            internal as "void*"
142        ] {
143            destroy((IBuilderConfig*) internal);
144        });
145    }
146}