gpt4 book ai didi

c++ - cuda中虚方法的缺点

转载 作者:太空狗 更新时间:2023-10-29 21:17:07 25 4
gpt4 key购买 nike

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

最佳答案

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

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

  1. 一个虚表查找;
  2. 间接分支。

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

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

关于c++ - cuda中虚方法的缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33690197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com