cudnnCreate() 调用是否在内部创建多个流?

Does cudnnCreate() call create multiple streams internally?

我正在编写一个简单的多流 CUDA 应用程序。以下是我创建 cuda-streamscublas-handlecudnn-handle 的代码部分:

cudaSetDevice(0);

int num_streams = 1;

cudaStream_t streams[num_streams];
cudnnHandle_t mCudnnHandle[num_streams];
cublasHandle_t mCublasHandle[num_streams];

for (int ii = 0; ii < num_streams; ii++) {
    cudaStreamCreateWithFlags(&streams[ii], cudaStreamNonBlocking);
    cublasCreate(&mCublasHandle[ii]);
    cublasSetStream(mCublasHandle[ii], streams[ii]);
    cudnnCreate(&mCudnnHandle[ii]);
    cudnnSetStream(mCudnnHandle[ii], streams[ii]);
}

现在,我的流计数是 1。但是当我使用 Nvidia Visual Profiler 分析上述应用程序的可执行文件时,我得到以下信息:

对于我创建的每个流,它都会创建另外 4 个流。我用 num_streams = 8 测试了它,它在分析器中显示了 40 个流。它在我脑海中提出了以下问题:

  1. cudnn 是否在内部创建流?如果是,那为什么?
  2. 如果它隐式创建流,那么使用它的方式是什么?
  3. 在这种情况下显式创建流有意义吗?

Does cudnn internally create streams?

是的。

If yes, then why?

因为是库,可能需要组织CUDA并发。流用于组织 CUDA 并发性。如果您想详细了解这些流的确切用途,则不会记录库内部结构。

If it implicitly creates streams then what is the way to utilize it?

这些流不适合您使用 separately/independently。它们供库使用,在库例程内部。

In such case does explicitly creating streams make any sense?

您仍然需要显式创建在库使用之外管理 CUDA 并发所需的任何流。

我想指出这个说法有点误导:

“对于我创建的每个流,它都会创建另外 4 个流。”

您正在做的是进行一个循环,并且在每次循环迭代中您都在创建一个新句柄。您的观察与您创建的句柄数量相关,而不是您创建的流数量。