我应该何时使用ASM呼叫? 我计划用C++编写一个游戏,它将非常的CPU密集(寻路,遗传算法,神经网络,……) 因此,我一直在思考如何最好地应对这种情况,使其顺利运行

我应该何时使用ASM呼叫? 我计划用C++编写一个游戏,它将非常的CPU密集(寻路,遗传算法,神经网络,……) 因此,我一直在思考如何最好地应对这种情况,使其顺利运行,c++,performance,assembly,C++,Performance,Assembly,(让这个问题的顶部部分作为旁白,我不想限制主要问题,但如果你也能给我旁白就好了) < >学习如何使用ASM是值得的,这样我就可以在C++中进行ASM调用了。 它能给我带来显著的性能优势吗 在什么情况下我应该使用它?几乎从不: 你只想在你对C++代码进行了剖析并确定了特定的一个区段作为瓶颈时使用它。 而且,在您耗尽所有C++优化选项之后,只想做它。 即使这样,您也只希望使用ASM实现紧密的内部循环 即使是这样,在现代平台上击败C++编译器需要花费很多的精力和技巧。 如果您不是经验丰富的汇编程序

(让这个问题的顶部部分作为旁白,我不想限制主要问题,但如果你也能给我旁白就好了)


< >学习如何使用ASM是值得的,这样我就可以在C++中进行ASM调用了。 它能给我带来显著的性能优势吗

在什么情况下我应该使用它?

几乎从不:

    你只想在你对C++代码进行了剖析并确定了特定的一个区段作为瓶颈时使用它。
  • 而且,在您耗尽所有C++优化选项之后,只想做它。
  • 即使这样,您也只希望使用ASM实现紧密的内部循环 即使是这样,在现代平台上击败C++编译器需要花费很多的精力和技巧。
如果您不是经验丰富的汇编程序员,我怀疑您能否比编译器更好地优化汇编代码


还要注意的是,该组件是不可移植的。如果您决定这样做,您将不得不为您决定支持的所有体系结构编写不同的程序集。

简短回答:视情况而定,您很可能不需要它

不要过早地开始优化。编写易于阅读和修改的代码。将逻辑部分分成模块。写一些容易扩展的东西

做一些分析。 除非对代码进行概要分析,否则无法判断瓶颈在哪里。99%的情况下,编写asm不会获得那么多性能提升。你很有可能会让你的表现更糟。现在的优化器非常擅长他们的工作。如果您确实遇到了瓶颈,那么很可能是因为选择了一些糟糕的算法,或者至少是一些可以在高级上解决的问题

我的建议是,即使你确实学习了asm,这是一件好事,也不要只是为了优化而这样做


Profile…

进入低级(尽管有时编译器可以为您推断)的合法用例是使用SIMD指令,例如。我想至少你提到的一些算法会从并行处理中受益


然而,您不需要编写实际的程序集,相反,您可以简单地使用内部函数。请参阅,例如,

< P>“为了理解递归,你必须首先理解递归。”当我考虑我对你的问题的回答时,这句话就会浮现在脑海中,那就是“直到你明白何时使用汇编,你永远不应该使用汇编”。广泛地剖析了它的性能并确定了精确的瓶颈,并尝试了几种可供选择的解决方案,然后可以开始考虑使用汇编程序。如果你在拥有一个可以正常工作且被广泛分析的程序之前就编写了一行汇编代码,那么你就犯了一个错误。

不要超前

我发布了一篇文章,展示了一个模拟程序是如何被大幅加速的(超过700倍)

这并不是通过预先假设需要快速完成的事情来实现的

它是通过“profileing”完成的,我在引号中加了引号,因为我使用的方法不是使用profiler。 相反,我所依赖的是一种被一些程序员所熟知并使用的效果良好的方法

它通过一系列迭代进行。 在每次迭代中,确定并固定了大量的时间消耗源,从而产生一定的加速比

当您进行多次迭代时,这些加速比将相乘(如复利)。 这就是你获得重大加速的原因

如果(且仅当)您达到某一点,即某些代码占用了大量时间,并且它不包含任何函数调用,并且您认为您可以编写比编译器更好的汇编代码,那么就开始吧

另外,如果你想知道,使用探查器和随机暂停的区别在于探查器寻找“瓶颈”,前提是这些都是本地化的东西。他们寻找占总时间很大百分比的例程或代码行。 他们错过的是分散的问题。 例如,您可以有100个例程,每个例程占用1%的时间。 也就是说,没有瓶颈。 然而,可能有一项活动在许多或所有这些例行程序中进行,占时间的1/3,可以做得更好,也可以根本不做。 随机暂停会看到该活动包含少量样本,因为您不进行总结,而是检查样本。 换句话说,如果你采集了9个样本,你平均会注意到其中3个样本的活动。 这说明它很大。
因此,您可以修复它并获得3/2的加速比。

如果您需要询问,那么您不需要。

+1除非您知道您需要asm,否则您不需要它:)@Martin这就是问题所在。。。我什么时候需要asm,换句话说,我如何知道我什么时候需要它……对于我的应用程序,我非常确定我将不得不使用一些东西,因为根据目前的计划,使用我目前拥有/知道的选项,它将无法顺利运行;)您不仅需要了解x86体系结构,还需要了解图形系统的体系结构。因为大多数卡都是为DirectX设计的,DirectX也是为它们设计的,所以在这个库的下面是没有意义的。原谅我,如果你想要另一个gfx库。但我知道你发现处理器周期的意思,所以按照Luchian的建议和配置文件来分析C++中的瓶颈。@ XLIPPT:抱歉,我从来没有冒犯过它,它的目的是幽默地说,在编程的情况下,你不需要使用程序集,因为性能的原因。如果