cudnn 卷积工作区是否可重用?

Is cudnn convolution workspace reusable?

我需要找到有关提供给 cudnnConvolutionForwardcudnnConvolutionBackwardDatacudnnConvolutionBackwardFilter 函数系列的工作space 的参考或描述。

假设不同的层没有在 GPU 上并行执行,我可以为下一个 calls/layers 重用工作space吗?

我正在研究 caffe 的 cudnn_conv_layer.cpp 实现,层的实例为 3 个函数中的每一个分配了自己的和单独的 space。这似乎很浪费,因为从逻辑上讲,我应该能够为多个 layers/functions.

重用内存

但是我找不到明确允许或禁止此操作的引用,并且 Caffe 为每一层保留单独的工作space,我怀疑它总共可能会“浪费”大量内存。

是的,您可以将工作区重新用于来自不同层的调用。工作区只是算法工作所需的内存,而不是一种必须初始化或保持特定状态的上下文,您可以在 cuDNN 用户指南中看到它,例如here or here(例如,查看 cudnnGetConvolutionForwardWorkspaceSize 的文档)。这也是为什么在一层内,工作空间的大小被计算为所应用的任何算法所需的所有可能工作空间的最大值(好吧,乘以 CUDNN_STREAMS_PER_GROUP,如果多于一个,则还乘以组数,因为组可以并行执行)。

也就是说,在 caffe 中,很可能并行计算任何层的 2 个实例,而且我认为与一批必须存储的实际数据相比,工作空间没有那么大(尽管我'我不确定这部分,因为这取决于所使用的 NN 体系结构和算法),但我怀疑在常见情况下通过重用工作区是否可以赢得很多。

理论上你总是可以在相应的库调用之前分配工作区并在之后释放它,这样可以节省更多的内存,但它可能会在一定程度上降低性能。