Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C (n-乘法)与(n/2-乘法和#x2B;2加法)哪个更好?_C_Performance_Optimization_Implementation_Cpu Cycles - Fatal编程技术网

C (n-乘法)与(n/2-乘法和#x2B;2加法)哪个更好?

C (n-乘法)与(n/2-乘法和#x2B;2加法)哪个更好?,c,performance,optimization,implementation,cpu-cycles,C,Performance,Optimization,Implementation,Cpu Cycles,我有一个C程序,它有n次乘法(单次乘法和n次迭代),我发现另一个逻辑有n/2次(1次乘法+2次加法)的迭代。我知道两者都是O(n)的复杂性。但是在CPU周期方面。哪个更快?在计算机上测试。或者,查看处理器的规格并猜测 旧的逻辑不再适用:在现代处理器上,整数乘法可能非常便宜,在一些新的英特尔处理器上,它是3个时钟周期。在这些相同的处理器上,加法为1个周期。然而,在现代流水线处理器中,数据依赖性造成的暂停可能会导致添加需要更长的时间 我的猜测是,如果您正在执行折叠类型的操作,那么N个加法+N/2个乘

我有一个C程序,它有n次乘法(单次乘法和n次迭代),我发现另一个逻辑有n/2次(1次乘法+2次加法)的迭代。我知道两者都是O(n)的复杂性。但是在CPU周期方面。哪个更快?

在计算机上测试。或者,查看处理器的规格并猜测

旧的逻辑不再适用:在现代处理器上,整数乘法可能非常便宜,在一些新的英特尔处理器上,它是3个时钟周期。在这些相同的处理器上,加法为1个周期。然而,在现代流水线处理器中,数据依赖性造成的暂停可能会导致添加需要更长的时间

我的猜测是,如果您正在执行折叠类型的操作,那么N个加法+N/2个乘法比N个乘法慢,而对于贴图类型的操作,我的猜测正好相反。但这只是一个猜测

测试你是否想要真相


然而:大多数这样简单的算法都是内存受限的,而且两者的速度都是相同的。

首先,遵循Dietrich Epp的第一条建议-测量是(至少对于复杂的优化问题而言)唯一确定的方法

现在如果你想知道为什么一个比另一个快,我们可以试试。有两种不同的重要性能度量:延迟和交互吞吐量。这两个方面的简短总结:

延迟:这是指令在 依赖链。这些数字是最小值。缓存未命中, 未对准和异常可能会增加时钟计数 相当地。如果启用了超读,则使用相同的 另一个线程中的执行单元导致性能低下。 非规范数、NAN和无穷大不会增加延迟。这个 使用的时间单位是核心时钟周期,而不是参考时钟周期 由时间戳计数器给出

倒数吞吐量:每个处理器的平均核心时钟周期数 一系列同类独立指令的指令 在同一条线上

对于Sandy bridge,
add r,r/i
(进一步注意,r=寄存器,i=立即数,m=内存)的rec.吞吐量为0.33,而延迟为1

imulr,r
的延迟为3,接收吞吐量为1

因此,正如您所看到的,这完全取决于您的特定算法-如果您可以用两个独立的加法替换一个imul,那么您算法的这一特定部分可以获得50%的理论加速比(在最佳情况下,显然加速比约为350%)。但另一方面,如果您的add添加了一个有问题的依赖项,那么一个imul可能与一个add一样快

还要注意的是,我们忽略了所有额外的复杂性,如内存和缓存行为(通常会对执行时间产生非常大的影响)或复杂的东西,如µop fusion等。一般来说,唯一应该关心这些东西的人是编译器编写人员——只测量他们的工作结果要简单得多;)


无论如何,如果你想得到这些东西的详细列表,请参见(上面对延迟/记录吞吐量的描述也来自于该特定文档)。

这在很大程度上取决于你使用的物理硬件和编译器。如果这真的很重要,请在您的目标环境中对其进行基准测试。这在很大程度上取决于所使用的技术。这个问题太笼统了,无法给出一个好的答案。请测量它并找出答案(但请记住,任何结果都只适用于您当前的配置)。谢谢。我尝试了非常大的值。第一个比第二个占1.6倍。如果n=0,第一个更好