bob*_*obo 2 c++ performance multithreading function
我记得因为代码大小,CPU缓存或类似的东西,在某处"大型函数可能具有更高的执行时间".
如何判断函数大小是否会对我的应用程序造成性能影响?我怎样才能对此进行优化?我有一个CPU密集型计算,我已经拆分(与CPU核心一样多的线程).主线程等待所有工作线程完成后再继续.
我碰巧在Visual Studio 2010上使用C++,但我不确定这是非常重要的.
我正在运行一个光线追踪器,每个像素拍摄约5,000条光线.我创建(cores-1)线程(每个额外核心1个),将屏幕分成行,并将每一行分配给CPU线程.我trace在每个线程上运行该函数大约每像素5000次.
我实际上正在寻找加快速度的方法. 这是可能对我来说,通过重构减少主要跟踪功能的大小,我想知道我是否应该希望看到一个性能增益.
很多人似乎是在这里回答错误的问题,我在寻找一个答案这个特定的问题,即使你想我大概可以做的更好,通过优化功能的内容,我想知道是否有是一个功能大小/性能关系.
它不是函数的大小,它是运行时缓存的代码的总大小.你不会通过将代码分成更多的小函数来加快速度,除非在关键代码路径中根本没有调用其中的某些函数,因此不需要占用任何缓存.此外,如果编译器决定内联它们,那么任何将代码拆分成多个函数的尝试都可能被编译器反转.
因此,现在无法确定您当前的代码是否"会对性能造成影响".与您可以以不同方式构建代码的众多方式中的哪一种相比,这一点与之相比?而且你无法合理地预期这种变化会对性能产生任何特别的影响.
我想,你正在寻找的是那些很少执行的指令(你的分析器会告诉你,他们是),但坐落在被执行了很多(因此指令紧挨将需要在高速缓存中的很多,并将拉入他们周围的缓存线).如果您可以将常用代码集中在一起,那么您将从指令缓存中获得更多.
实际上,这不是一个非常富有成效的优化线.你不太可能会有太大的不同.如果不出意外,你常用的代码可能已经很小并且已经相邻了,它会在某个地方出现少量的紧密循环(你的探查器会告诉你在哪里).最低级别的缓存行通常很小(大约32或64字节),因此您需要对代码进行一些非常精细的重新排列.C++在你和目标代码之间投入了很多,这妨碍了在内存中仔细放置指令.
类似的工具perf可以为您提供有关缓存未命中的信息 - 其中大部分都不会用于可执行代码,但在大多数系统中,您要避免哪些缓存未命中并不重要:如果您可以避免某些缓存,那么您将加速代码.也许不是很多,除非是很多失误,但有些失误.
无论如何,你听到了什么背景?我听到它最常见的一个问题是函数内联有时会适得其反,因为有时代码膨胀的开销大于避免的函数调用开销.我不确定,但是如果你的编译器支持它,那么配置文件引导的优化可能会有所帮助.一个相当合理的配置文件引导优化是优先内联执行大量执行的调用站点,使更冷的代码更小,首先加载和修复的开销更少,并且(希望)对指令的破坏性更小当它被拉入时缓存.对编译器的了解远远超过我的人会想到这是否是一个良好的配置文件引导优化,因此决定是否实现它.
| 归档时间: |
|
| 查看次数: |
709 次 |
| 最近记录: |