我正在为我的n-body模拟器优化我的代码,在分析我的代码时,看到了这个:

这两行,
float diffX = (pNode->CenterOfMassx - pBody->posX);
float diffY = (pNode->CenterOfMassy - pBody->posY);
Run Code Online (Sandbox Code Playgroud)
pNode指向Node我已定义的类型对象的指针在哪里,并包含(与其他东西)2个浮点数,CenterOfMassx以及CenterOfMassy
pBody指向Body我已定义的类型对象的指针在哪里,并包含(与其他东西)2个浮点数,posX以及posY.
应该花费相同的时间,但不要.事实上,第一行占功能样本的0.46%,但第二行占5.20%.
现在我可以看到第二行有3条指令,第一条只有一条.
我的问题是为什么这些似乎做同样的事情,但在实践中做不同的事情?
如前所述,分析器仅列出第一行的一个汇编指令,但第二行列出三个汇编指令.但是,因为优化器可以移动很多代码,所以这不是很有意义.看起来代码已经过优化,可以先将所有值加载到寄存器中,然后执行减法操作.因此它从第一行执行动作,然后从第二行执行动作(加载),接着是第一行的动作和第二行的动作(减法).由于这很难表示,因此在显示与代码内联的反汇编时,它只是最接近哪一行对应于哪个汇编代码.
请注意,第一个加载已执行,并且在执行下一个加载指令时可能仍在CPU管道中.第二个负载与第一个负载中使用的寄存器无关.但是,第一次减法确实如此.该指令要求先前的加载指令在流水线中足够远,结果可以用作减法的操作数之一.当管道允许负载完成时,这可能会导致CPU停顿.
所有这些都强调了内存优化的概念在现代CPU上比CPU优化更重要.例如,如果您之前已将所需值加载到寄存器15指令中,则减法可能会更快地发生.
通常,您可以为优化做的最好的事情是使缓存与您将要使用的内存保持一致,并确保它尽快更新,而不是在需要内存之前.除此之外,优化也很复杂.
当然,所有这一切都因现代CPU进一步复杂化,可能会出现40-60 条无序执行指令.
为了进一步优化,您可以考虑使用以优化方式执行向量和矩阵运算的库.使用这些库中的一个,可以使用两个向量指令而不是4个标量指令.
| 归档时间: |
|
| 查看次数: |
71 次 |
| 最近记录: |