相关疑难解决方法(0)

round()for C++中的float

我需要一个简单的浮点舍入函数,因此:

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++ floating-point rounding

227
推荐指数
11
解决办法
36万
查看次数

类型转换会消耗额外的CPU周期

C/C++中的类型转换会导致额外的CPU周期吗?

我的理解是,在某些情况下至少应该消耗额外的CPU周期.就像从float到整数的类型转换一样,CPU应该要求将float结构转换为整数.

float a=2.0;
int b= (float)a;
Run Code Online (Sandbox Code Playgroud)

我想了解它会/不会消耗额外CPU周期的情况.

c c++ performance

28
推荐指数
4
解决办法
7898
查看次数

在x86上将float转换为int的最快方法是什么

在x86 CPU上将浮点数转换为int的最快方法是什么.优选在C或组件中(可以在C中内嵌)以获得以下任何组合:

  • 32/64/80位浮点数 - > 32/64位整数

我正在寻找一些比让编译器更快的技术.

c floating-point optimization x86 assembly

22
推荐指数
7
解决办法
2万
查看次数

如何加快浮点数到整数转换?

我们在项目中进行了大量的浮点到整数转换.基本上,这样的事情

for(int i = 0; i < HUGE_NUMBER; i++)
     int_array[i] = float_array[i];
Run Code Online (Sandbox Code Playgroud)

执行转换的默认C函数非常耗时.

是否有任何工作(可能是手动调整功能)可以加快一点点的过程?我们不太关心精度.

c c++ floating-point optimization performance

19
推荐指数
3
解决办法
2万
查看次数

在预测现代超标量处理器上的操作延迟时需要考虑哪些因素以及如何手动计算它们?

我希望能够手动预测任意算术的长度(即没有分支或内存,尽管这也很好)x86-64汇编代码将采用特定的体系结构,考虑到指令重新排序,超标量,延迟,消费者价格指数等

什么/描述必须遵循的规则才能实现这一目标?


我想我已经找到了一些初步规则,但是我没有找到任何关于将任何示例代码分解为这个详细程度的引用,所以我不得不做一些猜测.(例如,英特尔优化手册甚至几乎没有提到指令重新排序.)

至少,我正在寻找(1)确认每条规则是正确的,或者是每条规则的正确陈述,以及(2)我可能忘记的任何规则的列表.

  • 每个循环发出尽可能多的指令,从当前循环开始按顺序开始,并且可能与重新排序缓冲区大小一样远.
  • 如果出现以下情况,可以在给定周期发出指令:
    • 没有影响其操作数的指令仍在执行中.和:
    • 如果它是浮点指令,则它之前的每个浮点指令都被发出(浮点指令具有静态指令重新排序).和:
    • 该循环有一个功能单元可用于该指令.每个(?)功能单元是流水线的,这意味着它可以在每个周期接受1个新指令,并且对于给定功能类的CPI,总功能单元的数量是1/CPI(这里模糊不清:可能是例如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)

assembly pipeline latency x86-64 superscalar

8
推荐指数
1
解决办法
268
查看次数

浮点转换和性能

我知道在浮点数和整数之间进行转换时可能出现的错误,但性能如何(请忽略准确性问题)?

一般来说,如果我对不同算术类型的操作数进行n-ary操作,即不同的浮点类型(例如floatdouble)和浮点/整数类型组合(例如floatint),性能是否会受到影响?是否存在经验法则,例如,保持所有操作数相同?

PS:我在问,因为我正在编写一个表达式模板库,想知道是否允许对包含不同算术类型值的向量进行二进制运算.

c c++ floating-point performance

5
推荐指数
1
解决办法
2336
查看次数

为什么"ceil()"函数的返回类型是"double"而不是某种整数类型?

我刚刚实现了一行代码,其中需要对两个数字进行划分,结果需要四舍五入到下一个整数.我开始非常天真:

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",现在我失败了:返回双倍的舍入函数是什么意思?任何人都可以告诉我这件事吗?

c types type-conversion

4
推荐指数
1
解决办法
813
查看次数

有效地将int除以intmax

我有一个整数类型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++

4
推荐指数
1
解决办法
186
查看次数