首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何管理多线程GPU应用程序中的cuda流和TensorRT上下文?

如何管理多线程GPU应用程序中的cuda流和TensorRT上下文?
EN

Stack Overflow用户
提问于 2022-07-21 15:33:05
回答 1查看 414关注 0票数 0

对于tensorrt文件,我们将将其加载到引擎中,并为引擎创建Tensorrt上下文。然后,通过调用context->enqueueV2 2(),使用cuda流进行推理。

在创建cudaCreateStream上下文之后,我们需要调用()吗?还是只需要在选择GPU设备之后调用SetDevice()?TensorRT是如何关联库达流和坦索尔特上下文的?

我们可以使用多个流与一个坦索尔的上下文吗?

在多线程C++应用程序中,每个线程使用一个模型进行推理,一个模型可能加载在多个线程中;那么,在一个线程中,我们只需要一个引擎、一个上下文和一个流还是多个流?

EN

回答 1

Stack Overflow用户

发布于 2022-10-27 18:08:46

在创建cudaCreateStream上下文之后,我们需要调用()吗?

cudaCreateStream(),你是指cudaStreamCreate()吗?

您可以在创建引擎和运行时之后创建它们。

作为一个额外的琐事,你根本不必使用CUDA流。我尝试将数据从主机复制到设备,调用enqueueV2(),然后在不使用CUDA流的情况下将from设备复制到主机。效果很好。

TensorRT是如何关联库达流和坦索尔特上下文的?

关联是,您可以将相同的CUDA流作为参数传递给所有函数调用。下面的c++代码将说明这一点:

代码语言:javascript
复制
void infer(std::vector<void*>& deviceMemory, void* hostInputMemory, size_t hostInputMemorySizeBytes, cudaStream_t& cudaStream)
{
  auto success = cudaMemcpyAsync(deviceMemory, hostInputMemory, hostInputMemorySizeBytes, cudaMemcpyHostToDevice, cudaStream)
  if (not success) {... handle errors...}

  if (not executionContext.enqueueV2(static_cast<void**>(deviceMemory.data()), cudaStream, nullptr)
  { ... handle errors...}

  void* outputHostMemory; // allocate size for all bindings
  size_t outputMemorySizeBytes;
  auto success2 = cudaMemcpyAsync(&outputHostMemory, &deviceMemory.at(0), outputMemorySizeBytes, cudaMemcpyDeviceToHost, cudaStream);
  if (not success2) {... error handling ...}

  cudaStream.waitForCompletion();
}

如果希望在中使用完整的示例,可以检查c++存储库。我上面的代码只是一个例子。

我们可以使用多个流与一个坦索尔的上下文吗?

如果我正确地理解了你的问题,根据文档,答案是否定的。

在多线程C++应用程序中,每个线程使用一个模型进行推理,一个模型可能加载在多个线程中;那么,在一个线程中,我们只需要一个引擎、一个上下文和一个流还是多个流?

one model might be loaded in more than 1 thread

这听起来不对。

引擎(nvinfer1::ICudaEngine)是从TensorRT引擎文件创建的。引擎创建用于推理的执行上下文。

是TensorRT开发人员指南的一部分,说明哪些操作是线程安全的。其馀部分可视为非线程安全。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73069001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档