当前位置:  开发笔记 > 编程语言 > 正文

C++中的AI应用程序:虚拟功能的成本是多少?有哪些可能的优化?

如何解决《C++中的AI应用程序:虚拟功能的成本是多少?有哪些可能的优化?》经验,为你挑选了2个好方法。

在我用C++编写的AI应用程序中,

    没有太多的数值计算

    有许多结构需要运行时多态性

    通常,几个多态结构在计算过程中相互作用

在这种情况下,有没有任何优化技术?虽然我现在不打算优化应用程序,但为项目选择C++而不是Java的一个方面是提供更多的优势,以便能够使用非面向对象的方法(模板,过程,重载).

特别是,与虚拟功能相关的优化技术是什么?虚函数通过内存中的虚拟表实现.有没有办法将这些虚拟表预取到L2缓存上(从内存/ L2缓存中获取的成本正在增加)?

除此之外,C++中的数据局部技术是否有很好的参考?这些技术将减少数据提取到计算所需的L2高速缓存的等待时间.

更新:另请参阅以下相关论坛:界面的性能惩罚,几个基类的级别



1> loudej..:

虚函数非常有效.假设32位指针,内存布局大约是:

classptr -> [vtable:4][classdata:x]
vtable -> [first:4][second:4][third:4][fourth:4][...]
first -> [code:x]
second -> [code:x]
...

classptr指向通常在堆上的内存,偶尔在​​堆栈上,并以指向该类的vtable的四字节指针开始.但要记住的重要一点是vtable本身没有分配内存.它是一个静态资源,同一类类型的所有对象都将指向其vtable数组的完全相同的内存位置.调用不同的实例不会将不同的内存位置拉入L2缓存.

来自msdn的这个例子显示了具有虚拟func1,func2和func3的类A的vtable.不超过12个字节.很有可能不同类的vtable也将在编译库中物理上相邻(您需要验证这是您特别关注的),这可以在显微镜下提高缓存效率.

CONST SEGMENT
??_7A@@6B@
   DD  FLAT:?func1@A@@UAEXXZ
   DD  FLAT:?func2@A@@UAEXXZ
   DD  FLAT:?func3@A@@UAEXXZ
CONST ENDS

另一个性能问题是调用vtable函数的指令开销.这也非常有效.几乎与调用非虚函数相同.再次来自msdn的例子:

; A* pa;
; pa->func3();
mov eax, DWORD PTR _pa$[ebp]
mov edx, DWORD PTR [eax]
mov ecx, DWORD PTR _pa$[ebp]
call  DWORD PTR [edx+8]

在此示例ebp中,堆栈帧基指针具有A* pa零偏移量的变量.寄存器eax加载了位置[ebp]的值,因此它具有A*,edx加载了位置[eax]的值,因此它具有A类vtable.然后ecx加载[ebp],因为ecx表示"this"它现在保持A*,最后调用位置[edx + 8]的值,这是vtable中的第三个函数地址.

如果此函数调用不是虚拟的,则不需要mov eax和mov edx,但性能上的差异将是无法估量的.


值得注意的是,虽然调用虚函数的指令开销很小,但它们可能会以其他方式对性能产生负面影响.首先,它们阻止了许多优化,例如内联和分支预测.另一方面,它们可能会损害I-Cache性能

2> Xavier Nodet..:

C++性能技术报告草案的第5.3.3节完全致力于虚拟功能的开销.

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有