我正在编写一个简单的多流数据自动化系统应用程序。下面是我创建cuda-streams、cublas-handle和cudnn-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分析上述应用程序的可执行文件时,我得到如下信息:

对于我创建的每一个流,它都会创建额外的4个流。我用num_streams = 8对它进行了测试,它在分析器中显示了40条流。它在我的脑海中提出了以下问题:
cudnn内部创建流吗?如果是,为什么?发布于 2020-10-19 18:08:15
内部会创建流吗?
是。
如果是,那为什么?
因为它是一个图书馆,它可能需要组织CUDA并发。流用于组织CUDA并发。如果您想要详细解释流的确切用途,则不会记录库内部的内容。
如果它隐式地创建流,那么使用它的方法是什么?
这些流并不打算让您单独/独立地使用。它们是供库使用的,在库例程的内部。
在这种情况下,
显式创建流是否有意义?
您仍然需要显式地创建在库使用之外管理CUDA并发所需的任何流。
我想指出,这说法有点误导人:
“我创建的每一个流都会多创建4个流。”
您要做的是通过一个循环,在每个循环迭代中创建一个新句柄。您的观察与您创建的句柄的数量有关,而不是您创建的流的数量。
https://stackoverflow.com/questions/64432648
复制相似问题