To close the loop on this, here’s (my best idea of) what’s happening. Cudnn until v6 did not strictly control the dimensions of the output tensor that is passed to the convolution routines. Output dimensions were supposed to be calculated using provided function, user passing output dimensions that differ from expected could result in undefined behavior (which is what you were seeing - sometimes it would appear to run normally, probably producing garbage, sometimes it would result in illegal memory accesses). In cudnn v6, if passed output dimensions are bigger than what cudnn expects, it would return STATUS_NOT_SUPPORTED, and it would respect output dimensions passed by user if they are not bigger than what it expects. When negative output_padding is used, it results in output dimensions passed that are bigger than what cudnn expects. I’ve disabled using cudnn for negative output_padding cases in https://github.com/pytorch/pytorch/pull/996 31, but gradchecker tests still don’t pass for negative output_padding, and I don’t exactly know what pytorch backends compute in this case.