tensorflow - 与 TensorFlow/cuDNN 中的 NHWC 相比,NCHW 快多少?

标签 tensorflow gpu

The official TensorFlow performance guide指出:

Most TensorFlow operations used by a CNN support both NHWC and NCHW data format. On GPU, NCHW is faster. But on CPU, NHWC is sometimes faster.



对于卷积,NCHW 与 TensorFlow/cuDNN 中的 NHWC 相比要快多少?是否有任何引用或基准?

另外,为什么它更快?据我了解(见 here),GPU 上 NHWC 的 TensorFlow 将始终在内部转置为 NCHW,然后调用 NCHW 的 cuDNN 转换内核,然后将其转置回来。但它为什么这样做呢? cuDNN conv 内核也适用于 NHWC。也许在某个时候他们做了比较,NHWC 的 cuDNN conv 内核非常慢。但这是最新的吗?差异有多大? NHWC 如此缓慢的技术原因是什么?还是这种情况下的 cuDNN 内核没有得到很好的优化?

最佳答案

原因是大多数简单卷积的实现(这里不讨论 winograd 或 fft),最终都会进行某种简单的矩阵乘法,这意味着在它们的内部循环中,它们将两个张量的一些值相乘并对结果求和。

在 CPU 实现中,使用 SSE 或 AVX 优化,沿 C 维度执行此操作会更快,因为您只需将值 4 x 4 或 8 x 8 相乘,然后进行归约(将 4 或 8 的累加相加)最后,一旦您添加了所有 C 维度。

然而,在 GPU 上,跨线程减少是一个成本更高的操作(至少在 Kepler 引入包装级原子操作之前是这样),因此历史上它已经过优化,以便包装中的每个线程连续读取(在内存中)硬件值,并用循环对 C 的部分进行累加。

请注意,尽管最新的 nvidia 卡 (RTX) 现在具有张量乘法核心,可以在一次操作中处理小块,包括减少一小部分 C,因此在这些卡上使用 NHWC(或混合 NCHWC)实际上更快格式)。

关于tensorflow - 与 TensorFlow/cuDNN 中的 NHWC 相比,NCHW 快多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44280335/

相关文章:

python - RLException : [/directory] requires the 'logdir' arg to be set

optimization - 优化代码会变得不必要吗?

opencv - opencv gpu中的错误处理

c++ - Vulkan 中的设备到设备复制

python - UMat 很慢(OpenCV、Python)

user-interface - 如何构建 tensorflow 分析器 ui?

python - 如何加快 Keras 和 Tensorflow 中模型的加载?

graphics - Skia 或 Direct2D 如何使用 GPU 渲染线或多边形?

image-processing - Tensor.eval() 没有输出。 IPython 笔记本中只有一个闪烁的光标

python - 如何从tensorflow fully_connected获取权重