You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MIPS SIMD内置函数计算异常与结果差异问题求助

MIPS MSA 内置平方根函数测试问题排查

一、初始代码的问题与修复

问题现象

测试__builtin_msa_fsqrt_w时,计算结果与标准库sqrt()差异极大,输出出现无意义的大数:

0: 8.000000
0: 464848115.000000
1: 11.000000
1: 469762048.000000
2: 16.000000
2: 473236723.000000
3: 22.000000
3: 478150656.000000

问题原因

代码中直接使用C风格强制类型转换(v4f32)va,这会直接重新解释二进制位,而非进行数值类型转换。例如,uint32_t类型的64(二进制0x00000040)被当作float32类型时,对应一个完全无关的大数,计算平方根后再转成整数自然得到错误结果。

修复方案

使用MSA提供的专用类型转换内置函数完成整数与浮点的数值转换:

  • __builtin_msa_ffint_s_w:将32位带符号整数转换为单精度浮点
  • __builtin_msa_ftint_s_w:将单精度浮点转换为32位带符号整数

修改后的核心代码:

fr = __builtin_msa_ftint_s_w(__builtin_msa_fsqrt_w(__builtin_msa_ffint_s_w(va)));

二、修改后结果差异的合理性分析

修改后输出中,512的平方根结果不一致:

3: 22.000000
3: 23.000000 <<??

这是合理的,差异源于两者的取整规则不同:

  1. 标准库sqrt(512)返回双精度浮点值~22.6274,赋值给uint32_t时,C语言会自动截断小数部分,得到22。
  2. MSA的__builtin_msa_ftint_s_w函数采用四舍五入到最近整数的规则(若小数部分为0.5,则向偶数取整),22.6274会被舍入为23。

若需要让MSA结果与sqrt()的截断行为一致,可使用MSA的__builtin_msa_ftrunc_w先将浮点结果截断为整数,再转换为整数类型:

fr = __builtin_msa_ftint_s_w(__builtin_msa_ftrunc_w(__builtin_msa_fsqrt_w(__builtin_msa_ffint_s_w(va))));

内容的提问来源于stack exchange,提问作者wangt13

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 07:27:35