The official TensorFlow performance guide 状态:



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

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

最佳答案

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

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

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

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

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

10-12 16:34