cuda中虚方法的缺点

Cons of virtual methods in cuda

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

如果编译器可以将调用去虚拟化,它可能能够将其转换为常规方法调用,甚至将其内联。 Clang/LLVM,为 NVCC 提供支持,在某些情况下能够做到这一点,作为一种优化。您必须检查生成的代码才能知道是否属于这种情况。

如果编译器无法将调用去虚拟化,那么它可能会对性能产生影响,尤其是当该调用在热路径上时。虚拟通话需要:

  1. vtable 查找;
  2. 间接分支。

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

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