tensorRT---认识cuda RuntimeAPI(stream---流操作)

1. 流是一种基于 context 之上的任务管道抽象,一个 context 可以创建 n 个流
2. 流是异步控制的主要方式
3. nullptr 表示默认流,每个线程都有自己的默认流

串行同步执行状态

 从上面可以发现主程序是女朋友,当女朋友发出“想吃苹果了”则会去调用子函数过程如:“想吃苹果”-->“买苹果”-->“出门”-->“买苹果”-->“回来了”-->“拿到东西”,这个过程女朋友只能等到买回苹果,中间什么也不做,这就是串行同步执行状态,那么并行同步执行状态是怎么做呢?

并行同步执行状态

 从上面可以发现,当主程序女朋友调用函数买苹果后,立马就进入了写作业的状态,不会等待苹果的到来,继续向下执行,如果想做其他是,继续调用即可,此时男朋友的微信消息就相当于一个队列,女朋友只需要把想做的事放到队列里即可,不用等待,而男朋友这样从队列获取任务后就开始执行,男朋友获取任务的顺序和女朋友向队列里扔任务的顺序是保持一致的。假如刚开始女朋友发任务吃苹果后,男朋友正在买还没回来,现在右发任务吃西瓜、喝奶茶,此时男朋友会按照顺序买, 然后回来,而女朋友这里可以选择等待,也可以寻找做其他事,同时也可以知道男朋友的状态到哪了,然后什么时候取结果等等,都是可以做到的这就是异步同步过程。而流的操作就是这样的。

stream - 流

1. 上面的例子中, 男朋友的微信消息 ,就是任务队列,流的一种抽象
2. 女朋友发出指令后,他可以做任何事情,无需等待指令执行完毕,(指令发出的耗时也是极短的)
3. 即,异步操作,执行的代码,加入流的队列后,立即返回,不耽误时间
4. 女朋友发的指令被送到流中排队,男朋友根据流的队列,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将 YOLOv8s 模型转换为 TensorRT 的 engine 文件,然后通过 TensorRT API 加载 engine 文件并进行推理。 以下是大致的操作步骤: 1. 下载并安装 TensorRT。 2. 将 YOLOv8s 模型转换为 TensorRT 的 engine 文件。可以使用 TensorRT 的 Python API 或者 C++ API 进行转换。以下是使用 Python API 的示例代码: ```python import tensorrt as trt # 定义 TensorRT 的 builder 和 network builder = trt.Builder(trt.Logger(trt.Logger.WARNING)) network = builder.create_network() # 加载 YOLOv8s 模型 with trt.OnnxParser(network, builder) as parser: with open('yolov8s.onnx', 'rb') as model: parser.parse(model.read()) # 设置 TensorRT 的优化选项 builder.max_workspace_size = 1 << 30 builder.max_batch_size = 1 builder.fp16_mode = True # 构建 TensorRT 的 engine engine = builder.build_cuda_engine(network) # 保存 engine 文件 with open('yolov8s.engine', 'wb') as f: f.write(engine.serialize()) ``` 3. 使用 TensorRT API 加载 engine 文件并进行推理。以下是使用 C++ API 的示例代码: ```c++ #include <iostream> #include <fstream> #include <sstream> #include <vector> #include <cuda_runtime_api.h> #include <NvInfer.h> #include <NvInferPlugin.h> using namespace nvinfer1; int main(int argc, char* argv[]) { // 读取 engine 文件 std::ifstream engine_file("yolov8s.engine", std::ios::binary); if (!engine_file.good()) { std::cerr << "Error: could not open engine file." << std::endl; return -1; } std::stringstream engine_buffer; engine_buffer << engine_file.rdbuf(); engine_file.close(); std::string engine_str = engine_buffer.str(); // 创建 TensorRTruntime IRuntime* runtime = createInferRuntime(gLogger); if (!runtime) { std::cerr << "Error: could not create TensorRT runtime." << std::endl; return -1; } // 创建 TensorRT 的 engine ICudaEngine* engine = runtime->deserializeCudaEngine(engine_str.data(), engine_str.size()); if (!engine) { std::cerr << "Error: could not create TensorRT engine." << std::endl; return -1; } // 创建 TensorRT 的 execution context IExecutionContext* context = engine->createExecutionContext(); if (!context) { std::cerr << "Error: could not create TensorRT execution context." << std::endl; return -1; } // 准备输入数据 float* input_data = new float[input_size]; // TODO: 将输入数据填充到 input_data 中 // 准备输出数据 float* output_data = new float[output_size]; // 执行推理 void* bindings[] = { input_data, output_data }; context->executeV2(bindings); // 处理输出数据 // TODO: 处理 output_data 中的输出数据 // 释放资源 delete[] input_data; delete[] output_data; context->destroy(); engine->destroy(); runtime->destroy(); return 0; } ``` 以上是大致的操作步骤,具体实现还需要根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值