【问题标题】:Does cudnnCreate() call create multiple streams internally?cudnnCreate() 调用是否在内部创建多个流?
【发布时间】:2021-02-02 13:01:53
【问题描述】:

我正在编写一个简单的多流 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. 在这种情况下,显式创建流有意义吗?

【问题讨论】:

    标签: cuda gpgpu cudnn


    【解决方案1】:

    cudnn 是否在内部创建流?

    是的。

    如果是,那为什么?

    因为它是一个库,它可能需要组织 CUDA 并发。流用于组织 CUDA 并发。如果您想详细了解流的确切用途,则没有记录库内部。

    如果它隐式创建流,那么使用它的方式是什么?

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

    在这种情况下,显式创建流有意义吗?

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

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

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

    您正在做的是通过一个循环,并且在每次循环迭代中您都在创建一个新句柄。您的观察取决于您创建的句柄数量,而不是您创建的流数量。

    【讨论】:

    • 所以你的意思是说我可以对所有的流使用相同的句柄?由于他们提供了 cudnnSetStream() 函数,我认为我需要为每个流单独处理。
    • 不,我没有说您可以对所有流使用相同的句柄。您将需要的流数量问题是您的应用程序设计的一个功能,无法笼统地回答。对我来说,为什么需要 8 个单独的流来协调单个 GPU 上的 cuDNN 活动对我来说并不明显,但同样,它基于您的应用程序设计。
    • 其实是的。我的申请不一样。我上面发布的代码只是一个 POC 代码。当我在分析我的应用程序时发现那些额外的流时,我编写了这个 POC 代码。我的应用程序中有类似的东西。
    猜你喜欢
    • 2017-04-13
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 2011-09-23
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多