cuda中虚拟方法的缺点

Cons of virtual methods in cuda

本文关键字:缺点 方法 虚拟 cuda      更新时间:2023-10-16

据我所知,虚拟方法调用是后期绑定的,因此编译器无法内联。显然,nvcc在很大程度上依赖于内联代码。我想知道如果在Cuda的内核中使用虚拟方法,是否会有任何严重的缺点。是否存在应避免的情况?它们会对表现产生影响吗?

如果编译器能够将调用设为虚拟机,它可能能够将其转换为常规方法调用,甚至内联它。为NVCC提供动力的Clang/LLVM在某些情况下能够做到这一点,作为优化。您必须检查生成的代码,以了解情况是否如此。

如果编译器无法对调用进行虚拟化,则可能会对性能产生影响,尤其是当该调用位于热路径上时。虚拟呼叫需要:

  1. vtable查找
  2. 间接分支

vtable查找需要花费内存访问,这很慢(可能会"浪费"本可以更好地使用的缓存线),而且间接分支通常很昂贵。此外,如果不是warp中的所有线程都将虚拟方法解析到同一地址(例如,当处理具有不同具体类型的对象数组时),这将导致warp发散,这是另一个性能打击。

也就是说,如果您没有在热路径上调用虚拟方法,那么影响应该可以忽略不计。如果没有进一步的代码,就无法判断。