【问题标题】:cuInit(0) not needed anymore?cuInit(0) 不再需要了?
【发布时间】:2016-12-01 07:19:14
【问题描述】:

我目前正在编写一个应用程序来流式传输 openGL 内容,因此将 CUDA 与 NVidias NVenc-API 结合使用。我注意到调用 cuInit(0) - 根据许多教程,这应该作为初始化 Cuda 的第一次调用,不会改变我的 Cuda 内核的成功。因此,无论我是否调用它,程序都可以在两种情况下运行。

他们改变了吗?我正在寻找一些信息,但找不到任何关于此的信息。

谢谢!

更多信息:

第一步是使用cudaSetDevice() - Runtime API 创建一个 Cuda 设备。 第二步,使用cuCtxCreate() - Driver API 创建一个上下文。 在此之后,我可以使用三重 V 形语法启动内核,并使用通过 cudaMalloc() 分配的 cuda 数组。

【问题讨论】:

  • 您使用的是 CUDA 驱动程序还是运行时 API?
  • 两个 API 都可以工作。
  • 这不是我问的。您的代码是使用运行时 API 还是驱动程序 API? NVenc 本身与 CUDA 无关,也不需要 CUDA 上下文来运行。
  • 好的,所以我想因为我用>>启动内核,它是运行时API?

标签: c++ cuda


【解决方案1】:

如果您的代码中的第一个调用是 cudaSetDevice(),并且您的 CUDA 版本是 CUDA 4 或更高版本,那么这将隐式建立一个上下文,并且不需要执行任何其他操作来创建CUDA 运行时 API 会话正常工作。

您应该不在那之后致电cuCtxCreate 或cuInit。如果您确实需要同时使用运行时 API 和驱动程序 API(听起来不像您这样做),可以使用 supported and documented 方法来执行此操作。经验法则是使用任一驱动API或运行时API,但不能同时使用,如果你没有理由使用驱动API,然后不要使用它。运行时 API 更简单、更简洁、更简洁。

【讨论】:

  • 好的,谢谢。因此,如果我需要一个有效的 CudaContext 的句柄,我必须使用驱动程序 api 并且最多省略对运行时 api 的每次调用?
  • 没有。如果您需要驱动程序 API 功能,仍然可以混合 API,但请按照我的答案中链接中描述的过程:使用驱动程序 API 创建上下文,然后使用运行时 API(并且您必须调用 @ 987654325@ 作为这种用例中的第一个调用)
猜你喜欢
  • 2016-02-14
  • 2016-10-30
  • 2019-11-15
  • 2018-07-24
  • 1970-01-01
  • 1970-01-01
  • 2019-01-23
  • 1970-01-01
  • 2021-04-15
相关资源
最近更新 更多