use fast math问题

大家好,我有两个问题
1.我看手册中说把sin cos 函数可以换成 __sin __cos 函数可以提高速度但是会降低精度,可是我换成__sin后编译说出错了:__sin 没定义,理解的是不需要替换sin 为__sin,而只需要在项目属性中设置 use fast math就可以了,对吗?
2.我选择了use fast math速度反而下降了,这是怎么回事?

人家是__sinf和__cosf,老张你看仔细了。

sin和cos有额外的float版本,是为你做的容错处理了(函数重载)。
但快速版本的SFU的__sinf和__cosf只有float版本,无double处理,也无__sin/__cos这种命名风格的double函数的float重载版本,自然您出错了。

关于您的第二个问题,这个是有可能的,但一般不会遇到,请您重新仔细评估时间,
而可能的原因则是,使用-use_fast_math后,一些函数的计算将更加依赖SFU,如果您本来就是卡在SFU上(相当于原来SP计算掩盖在了SFU中),现在偏重比例变换,慢是有可能的。
不过刚才说,这个一般较大的可能是您的评估时间错误。

请您加上2个f字母,以及考虑我的第二个问题的建议。

感谢您的深夜来访。

我来稍微补充一下玫瑰斑竹:

诚然设置use fast math之后,sinf(),cosf()等函数会被强制作为__sinf(),__cosf()处理,但是这个设置是全局性的,而您可以直接在您的程序中有选择地使用__sinf(),__cosf()与常规的sinf(),cosf(),已取得更好的灵活性。

感谢深夜来访,祝您晚安。

非常感谢二位版主的回答,那就是说如果部分函数用SFU 就不能选择use fast math?
我一开始也试了__sinf但是还是 没定义,是不是少了什么头文件呢?

楼主您好,

玫瑰没有说过您不能用,唯一标准就是您的速度变化,请以这个为准(当然,是你测试正确的前提下)。

其次,__sinf只接受float类型的参数,请您确定您的参数类型不是double!

感谢您的午夜来访。

谢谢玫瑰深夜解惑,我查了一下是我的问题,__sinf是可以的。但是从时间效率上只有1us的提高.

LZ您好:

恭喜您搞定__sinf()的使用问题。

至于速度提高的情况,这是一个综合性的问题,假如之前的瓶颈并不在sinf()的计算上,那么优化这里确实无法有明显的改变。

祝您编码顺利~