我需要一个简单的浮点舍入函数,因此:
double round(double);
round(0.1) = 0
round(-0.1) = 0
round(-0.9) = -1
Run Code Online (Sandbox Code Playgroud)
我能找到ceil()和floor()在math.h中-但不是round().
它是以另一个名称存在于标准C++库中,还是缺少?
C/C++中的类型转换会导致额外的CPU周期吗?
我的理解是,在某些情况下至少应该消耗额外的CPU周期.就像从float到整数的类型转换一样,CPU应该要求将float结构转换为整数.
float a=2.0;
int b= (float)a;
Run Code Online (Sandbox Code Playgroud)
我想了解它会/不会消耗额外CPU周期的情况.
在x86 CPU上将浮点数转换为int的最快方法是什么.优选在C或组件中(可以在C中内嵌)以获得以下任何组合:
我正在寻找一些比让编译器更快的技术.
我们在项目中进行了大量的浮点到整数转换.基本上,这样的事情
for(int i = 0; i < HUGE_NUMBER; i++)
int_array[i] = float_array[i];
Run Code Online (Sandbox Code Playgroud)
执行转换的默认C函数非常耗时.
是否有任何工作(可能是手动调整功能)可以加快一点点的过程?我们不太关心精度.
我希望能够手动预测任意算术的长度(即没有分支或内存,尽管这也很好)x86-64汇编代码将采用特定的体系结构,考虑到指令重新排序,超标量,延迟,消费者价格指数等
什么/描述必须遵循的规则才能实现这一目标?
我想我已经找到了一些初步规则,但是我没有找到任何关于将任何示例代码分解为这个详细程度的引用,所以我不得不做一些猜测.(例如,英特尔优化手册甚至几乎没有提到指令重新排序.)
至少,我正在寻找(1)确认每条规则是正确的,或者是每条规则的正确陈述,以及(2)我可能忘记的任何规则的列表.
addps并且subps使用相同的功能) unit?我如何确定?).和:4此循环已经发出少于超标量宽度(通常)指令的数量.例如,请考虑以下示例代码(计算交叉产品):
shufps xmm3, xmm2, 210
shufps xmm0, xmm1, 201
shufps xmm2, xmm2, 201
mulps xmm0, xmm3
shufps xmm1, xmm1, 210
mulps xmm1, xmm2
subps xmm0, xmm1
Run Code Online (Sandbox Code Playgroud)
我试图预测Haswell的延迟看起来像这样:
; `mulps` Haswell latency=5, CPI=0.5
; `shufps` Haswell latency=1, CPI=1
; `subps` Haswell latency=3, CPI=1
shufps xmm3, xmm2, 210 ; cycle 1
shufps xmm0, xmm1, 201 ; cycle 2
shufps xmm2, xmm2, 201 ; …Run Code Online (Sandbox Code Playgroud) 我知道在浮点数和整数之间进行转换时可能出现的错误,但性能如何(请忽略准确性问题)?
一般来说,如果我对不同算术类型的操作数进行n-ary操作,即不同的浮点类型(例如float和double)和浮点/整数类型组合(例如float和int),性能是否会受到影响?是否存在经验法则,例如,保持所有操作数相同?
PS:我在问,因为我正在编写一个表达式模板库,想知道是否允许对包含不同算术类型值的向量进行二进制运算.
我刚刚实现了一行代码,其中需要对两个数字进行划分,结果需要四舍五入到下一个整数.我开始非常天真:
i_quotient = ceil(a/b);
Run Code Online (Sandbox Code Playgroud)
作为数字a并且b都是整数,这不起作用:除法作为整数除法执行,默认情况下向下舍入,因此我需要强制除法为浮点运算:
i_quotient = ceil((double) a / b);
Run Code Online (Sandbox Code Playgroud)
现在这似乎工作,但它留下一个警告说我正在尝试将一个double分配给一个整数,实际上,在头文件"math.h"之后,ceil()函数的返回类型是"double",现在我失败了:返回双倍的舍入函数是什么意思?任何人都可以告诉我这件事吗?
我有一个整数类型uint32_t,想将其除以的最大值,uint32_t并得到a的结果float(范围为0..1)。
当然,我可以执行以下操作:
float result = static_cast<float>(static_cast<double>(value) / static_cast<double>(std::numeric_limits<uint32_t>::max()))
Run Code Online (Sandbox Code Playgroud)
但是,这实际上是很多转换,而除法本身可能会很昂贵。
Is there a way to achieve the above operation faster, without division and excess type conversions? Or maybe I shouldn't worry because modern compilers are able to generate an efficient code already?
Edit: division by MAX+1, effectively giving me a float in range [0..1) would be fine too.
A bit more context:
I use the above transformation in a time-critical loop, with uint32_t being …
c ×5
c++ ×5
performance ×3
assembly ×2
optimization ×2
latency ×1
pipeline ×1
rounding ×1
superscalar ×1
types ×1
x86 ×1
x86-64 ×1