BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #96974同步于 2017/12/7
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

计算机处理浮点数时,数值本身对CPU资源的影响

yicigenshi
2017/12/7镜像同步18 回复
用C++写均衡器,31频段的GEQ。 分了16个线程,每个线程处理两个频段、24个声道、1024个样点。每个样点都要进行时域滤波运算,所以每个线程需要循环2*24*1024次,每次循环要做5次浮点乘法、5次浮点加法。 然后问题来了: 如果输入全是0,CPU占用率会暴涨,计算耗时也会更高,直至程序崩溃。。。 如果输入的是正常的音频数据,CPU也是正常的,但是这个占用率很不稳定、浮动很大。 请教一下,这背后是啥原理?对于浮点型运算,数值对CPU影响真有这么大? 0,为什么这么特殊?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
nuanyangyang机器人#1 · 2017/12/7
估计是你的算法有问题,输入0会引起你的算法陷入某种异常情形中。耗时长说明程序处理异常的输入数据很低效,崩溃说明处理方法有误。属于编程错误的范畴。 对于CPU来说,浮点数并没有什么特别的地方。CPU有浮点寄存器,现代的CPU一般都还有向量寄存器。对于常见的x86_64来说,浮点数一般存放在向量寄存器xmm0, xmm1, ...里面(即使是标量也存在向量寄存器里),CPU有指令可以对浮点数进行加减乘除、开平方、对数等运算,速度很快,对于加减运算来说,吞吐率和延迟和整数差不多,复杂的运算可能会比较耗时,但也不会到程序崩溃的地步。 如果搞数值计算,建议看看IEEE754标准,这是现代CPU一般使用的浮点数格式。里面规定了运算的精度、舍入规则,以及对于正负0、正负无穷大、NaN等特殊值的处理方法。如果你遇到了那些异常情形,看这个标准会很有帮助。
bond1993机器人#2 · 2017/12/8
同意暖神看法(也学到了新东西) CPU本身看重通用性,如果会因为浮点数数值不同而产生可以观测到的差异,那么这样的CPU的通用性也要打一个问号吧 更正:看完三楼发现竟然还有这种操作...瑟瑟发抖
xyz机器人#3 · 2017/12/8
仅供参考:http://cenalulu.github.io/linux/about-denormalized-float-number/
liuyehcf机器人#4 · 2017/12/8
日常膜拜暖神~ 【 在 nuanyangyang 的大作中提到: 】 : 估计是你的算法有问题,输入0会引起你的算法陷入某种异常情形中。耗时长说明程序处理异常的输入数据很低效,崩溃说明处理方法有误。属于编程错误的范畴。 : 对于CPU来说,浮点数并没有什么特别的地方。CPU有浮点寄存器,现代的CPU一般都还有向量寄存器。对于常见的x86_64来说,浮点数一般存放在向量寄存器xmm0, xmm1, ...里面(即使是标量也存在向量寄存器里),CPU有指令可以对浮点数进行加减乘除、开平方、对数等运算,速度很快,对于加减运算来说,吞吐率和延迟和整数差不多,复杂的运算可能会比较耗时,但也不会到程序崩溃的地步。 : 如果搞数值计算,建议看看IEEE754标准,这是现代CPU一般使用的浮点数格式。里面规定了运算的精度、舍入规则,以及对于正负0、正负无穷大、NaN等特殊值的处理方法。如果你遇到了那些异常情形,看这个标准会很有帮助。
unimit机器人#5 · 2017/12/8
暖神划重点,3楼给答案,蒟蒻的我,进楼学习。
ab719565790机器人#6 · 2017/12/8
学习了
qiaoqiao528机器人#7 · 2017/12/8
学习学习,讲真, 一开始那2行 y+0.1f; 跟 y-0.1f; 我都没看懂23333
lucashood机器人#8 · 2017/12/9
膜暖神 【 在 nuanyangyang (暖羊羊) 的大作中提到: 】 : 估计是你的算法有问题,输入0会引起你的算法陷入某种异常情形中。耗时长说明程序处理异常的输入数据很低效,崩溃说明处理方法有误。属于编程错误的范畴。 : 对于CPU来说,浮点数并没有什么特别的地方。CPU有浮点寄存器,现代的CPU一般都还有向量寄存器。对于常见的x86_64来说,浮点数一般存放在向量寄存器xmm0... : ...................
yqyqyqyqyqy机器人#9 · 2017/12/9
暖神画重点,3楼给答案,5楼写的字我都不认识[ema1]