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

Alb*_*ert 9 gpu tensorflow cudnn

TensorFlow官方性能指南指出:

CNN使用的大多数TensorFlow操作都支持NHWC和NCHW数据格式。在GPU上,NCHW更快。但是在CPU上,NHWC有时更快。

与TensorFlow / cuDNN中的NHWC相比,NCHW的卷积速度要快多少?是否有任何参考或基准?

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

小智 6

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

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

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

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