Tensorrt笔记(一) C++ API

这个系列需要注意可读性,便于以后迭代阅读。

框架必须明晰

参考:Developer Guide :: NVIDIA Deep Learning TensorRT Documentation

1 须知

  • 接口类以字母"I"作为前缀,例如ILogger、IBuilder等等;
  • TensorRT在第一次调用CUDA时会自动创建一个CUDA上下文,所以,首次调用TensorRT之前自己创建和配置CUDA上下文。
  • 为了说明对象的生命周期,本章代码不使用智能指针;然而,建议在使用TensorRT接口时使用智能指针。

2 构建阶段

ILogger

class Logger : public ILogger           
{
    void log(Severity severity, const char* msg) noexcept override
    {
        // suppress info-level messages
        if (severity <= Severity::kWARNING)
            std::cout << msg << std::endl;
    }
} logger;

// 创建推理引擎
IBuilder* builder = createInferBuilder(logger);
<think>好的,我现在需要回答用户关于enqueueV3方法的使用教程或文档的问题。用户提供了三个引用内容,我需要仔细分析这些内容,并结合自己的知识来给出准确的回答。 首先,用户提到的引用[1]和[3]都提到了使用context->enqueueV3(stream)来在CUDA流上启动推理。这说明enqueueV3是TensorRT中用于异步执行推理的方法,需要结合CUDA流来使用。引用[3]还提到,使用enqueueV3后,控制权会尽快返回给应用程序,如果需要等待执行完成,需要用cudaStreamSynchronize进行同步。此外,引用[2]提到Oracle session等待特定的enqueue,但可能和当前问题关联不大,可能属于其他上下文。 接下来,我需要整理enqueueV3的使用步骤。根据引用内容,步骤可能包括创建执行上下文、配置输入输出缓冲区、创建CUDA流、调用enqueueV3以及同步流。同时,需要注意异步执行的特点,可能需要处理输入数据的拷贝和输出的同步。 然后,要确保回答结构清晰,分步骤说明,并引用正确的文献。同时,生成相关问题,可能涉及异步执行的优势、错误处理、性能优化等。 需要验证TensorRT的官方文档是否支持这些步骤,比如enqueueV3是否需要特定的上下文设置,输入输出缓冲区是否必须使用GPU内存,以及错误处理的方式。例如,是否正确处理了输入数据在GPU上的位置,是否需要在调用enqueueV3前将数据从主机拷贝到设备。 可能还需要考虑不同版本的TensorRT是否有差异,但用户没有提到版本,所以需要保持回答通用。同时,提醒用户参考官方文档以确保兼容性。 最后,生成相关问题时要围绕enqueueV3的使用场景、同步异步区别、常见错误和性能优化等方面展开。</think>### enqueueV3 使用方法说明 `enqueueV3` 是 NVIDIA TensorRT 中用于异步执行推理任务的方法,需配合 CUDA 流(CUDA Stream)实现高效并行计算。以下是其核心使用步骤及注意事项: #### 1. **准备工作** - **创建执行上下文**:通过 TensorRT 的 `IExecutionContext` 接口初始化推理上下文。 - **配置输入/输出缓冲区**:确保输入/输出数据已分配 GPU 内存(例如使用 `cudaMalloc`),并绑定到推理上下文中[^3]。 #### 2. **调用 enqueueV3** ```cpp // 假设已创建 context 和 CUDA 流(cudaStream_t stream) context->enqueueV3(stream); ``` - **异步执行**:此方法将推理任务提交到 CUDA 流后立即返回,允许 CPU 继续处理其他任务[^1][^3]。 - **数据传输**:需提前将输入数据从主机内存拷贝到 GPU 缓冲区(例如使用 `cudaMemcpyAsync`),并在输出阶段反向拷贝结果。 #### 3. **同步流** ```cpp cudaStreamSynchronize(stream); // 等待推理完成 ``` - 若需要确保推理任务完成后再进行后续操作(如读取输出数据),必须调用此方法[^3]。 #### 4. **关键注意事项** - **流管理**:不同 CUDA 流间的任务可能并行执行,需合理设计流逻辑以优化性能。 - **错误处理**:异步执行中需通过 CUDA 错误检查(如 `cudaPeekAtLastError`)捕获潜在问题。 - **插件兼容性**:若模型包含自定义插件(Plugins),需确保其支持异步执行[^3]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值