Thanks for your input, @tom.  Actually, after I posted I did a bit of inspecting (using oprofile because I had the logs sitting around so I didn’t have to run anything new) and indeed it looks like cudNN is being used my libtorch, which leaves me befuddled.  It isn’t a synchronization issue because, just in case, I do a GPU -> CPU transfer, which is blocking.
I wonder if it might have to do with the way I build my cuDNN application vs. the way libtorch is built?  On that theory, I’ve tried both dynamic and static linking in my cuDNN test app without seeing any difference in terms of performance.