gpt4 book ai didi

c++ - 处理器真的计算乘以零或一吗?为什么?

转载 作者:可可西里 更新时间:2023-11-01 18:35:58 24 4
gpt4 key购买 nike

精简版

在下一行中:

aData[i] = aData[i] + ( aOn * sin( i ) );

如果 aOn01,处理器是实际执行乘法,还是有条件地计算出结果(0 代表 0,other-value 代表 1)?

长版

我正在研究算法性能一致性,这部分涉及对 Branch Prediction 的影响的研究.

假设是这段代码:

for ( i = 0; i < iNumSamples; i++ )
aData[i] = aData[i] + ( aOn * sin( i ) );

将提供比此代码更稳定的性能(其中分支预测可能会破坏性能):

for ( i = 0; i < iNumSamples; i++ )
{
if ( aOn )
aData[i] = aData[i] + sin( i );
}

aOn01,它可以在另一个线程执行循环期间切换。

实际的条件计算(上例中的+ sin( i ))涉及更多的处理,if条件必须在循环内(条件有很多种,而不是像上面的示例;此外,对 aOn 的更改应该立即生效,而不是每个循环)。

忽略性能一致性,两个选项之间的性能权衡在于执行 if 语句和执行乘法所花费的时间。

无论如何,很容易发现,如果处理器不对 10 等值执行实际的乘法运算,第一个选项可能是双赢的解决方案(无分支预测,性能更好)。

最佳答案

处理器执行 01 的常规乘法。

原因是,如果处理器在每次计算之前检查01,条件的引入将花费更多的周期。虽然您将获得 01 乘数的性能,但您将失去任何其他值的性能(更有可能)。

一个简单的程序可以证明这一点:

#include <iostream>
#include "cycle.h"
#include "time.h"

void Loop( float aCoefficient )
{
float iSum = 0.0f;

clock_t iStart, iEnd;

iStart = clock();
for ( int i = 0; i < 100000000; i++ )
{
iSum += aCoefficient * rand();
}
iEnd = clock();
printf("Coefficient: %f: %li clock ticks\n", aCoefficient, iEnd - iStart );
}

int main(int argc, const char * argv[])
{
Loop( 0.0f );
Loop( 1.0f );
Loop( 0.25f );

return 0;
}

输出为:

Coefficient: 0.000000: 1380620 clock ticks
Coefficient: 1.000000: 1375345 clock ticks
Coefficient: 0.250000: 1374483 clock ticks

关于c++ - 处理器真的计算乘以零或一吗?为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17536988/

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