返回信息流用C++写均衡器,31频段的GEQ。
分了16个线程,每个线程处理两个频段、24个声道、1024个样点。每个样点都要进行时域滤波运算,所以每个线程需要循环2*24*1024次,每次循环要做5次浮点乘法、5次浮点加法。
然后问题来了:
如果输入全是0,CPU占用率会暴涨,计算耗时也会更高,直至程序崩溃。。。
如果输入的是正常的音频数据,CPU也是正常的,但是这个占用率很不稳定、浮动很大。
请教一下,这背后是啥原理?对于浮点型运算,数值对CPU影响真有这么大?
0,为什么这么特殊?
这是一条镜像帖。来源:北邮人论坛 / cpp / #96974同步于 2017/12/7
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
计算机处理浮点数时,数值本身对CPU资源的影响
yicigenshi
2017/12/7镜像同步18 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
估计是你的算法有问题,输入0会引起你的算法陷入某种异常情形中。耗时长说明程序处理异常的输入数据很低效,崩溃说明处理方法有误。属于编程错误的范畴。
对于CPU来说,浮点数并没有什么特别的地方。CPU有浮点寄存器,现代的CPU一般都还有向量寄存器。对于常见的x86_64来说,浮点数一般存放在向量寄存器xmm0, xmm1, ...里面(即使是标量也存在向量寄存器里),CPU有指令可以对浮点数进行加减乘除、开平方、对数等运算,速度很快,对于加减运算来说,吞吐率和延迟和整数差不多,复杂的运算可能会比较耗时,但也不会到程序崩溃的地步。
如果搞数值计算,建议看看IEEE754标准,这是现代CPU一般使用的浮点数格式。里面规定了运算的精度、舍入规则,以及对于正负0、正负无穷大、NaN等特殊值的处理方法。如果你遇到了那些异常情形,看这个标准会很有帮助。
同意暖神看法(也学到了新东西)
CPU本身看重通用性,如果会因为浮点数数值不同而产生可以观测到的差异,那么这样的CPU的通用性也要打一个问号吧
更正:看完三楼发现竟然还有这种操作...瑟瑟发抖
日常膜拜暖神~
【 在 nuanyangyang 的大作中提到: 】
: 估计是你的算法有问题,输入0会引起你的算法陷入某种异常情形中。耗时长说明程序处理异常的输入数据很低效,崩溃说明处理方法有误。属于编程错误的范畴。
: 对于CPU来说,浮点数并没有什么特别的地方。CPU有浮点寄存器,现代的CPU一般都还有向量寄存器。对于常见的x86_64来说,浮点数一般存放在向量寄存器xmm0, xmm1, ...里面(即使是标量也存在向量寄存器里),CPU有指令可以对浮点数进行加减乘除、开平方、对数等运算,速度很快,对于加减运算来说,吞吐率和延迟和整数差不多,复杂的运算可能会比较耗时,但也不会到程序崩溃的地步。
: 如果搞数值计算,建议看看IEEE754标准,这是现代CPU一般使用的浮点数格式。里面规定了运算的精度、舍入规则,以及对于正负0、正负无穷大、NaN等特殊值的处理方法。如果你遇到了那些异常情形,看这个标准会很有帮助。
膜暖神
【 在 nuanyangyang (暖羊羊) 的大作中提到: 】
: 估计是你的算法有问题,输入0会引起你的算法陷入某种异常情形中。耗时长说明程序处理异常的输入数据很低效,崩溃说明处理方法有误。属于编程错误的范畴。
: 对于CPU来说,浮点数并没有什么特别的地方。CPU有浮点寄存器,现代的CPU一般都还有向量寄存器。对于常见的x86_64来说,浮点数一般存放在向量寄存器xmm0...
: ...................