CUDA 流每线程和库行为

use*_*513 2 multithreading cuda

我正在每个线程使用 --default 流,以便从 2 个非默认流中的 2 个主机线程发出内核。一切正常,直到我想在两个线程中使用 cudnn,因为对 cudnn api 的任何调用都会在默认线程上执行该 api。

我想在与进行 cudnn api 调用的主机线程关联的流中运行每个 cudnn api。我知道我可以使用 cudnnSetStream() 设置非默认流,但我需要获取与主机线程关联的流,以便将其传递给 cudnnSetStream()。

在主机端,如何获取由 cuda 关联到我想要从中调用 cudnn api 的当前主机线程的流?

编辑:我正在使用 C 和 ubuntu。

谢谢。

Rob*_*lla 5

一般来说,编译的库不会选择您在编译调用该预编译库的自己的代码时--default-stream per-thread传递给的选择。nvcc在这种情况下,您也不能只设置空流。

在这种情况下,为了使库使用默认流(假设库具有流设置功能),您应该使用流句柄,这在此处cudaStreamPerThread提到。

就像是:

cudnnSetStream(handle, cudaStreamPerThread);
Run Code Online (Sandbox Code Playgroud)

或者:

cublasSetStream(handle, cudaStreamPerThread);
Run Code Online (Sandbox Code Playgroud)

或者:

nppSetStream(cudaStreamPerThread) 
Run Code Online (Sandbox Code Playgroud)

对于 CUFFT 和其他具有流设置功能的库来说,这也应该类似地工作。