MIPS架构下linux软浮点研究

2023-10-27

转自 :http://blog.sina.com.cn/s/blog_67b113a10100zxx3.html


在嵌入式领域,为了节省成本和减少功耗,很多芯片都是没有浮点运算模块的,一般该模块叫做FPU(float process unit)。这种情况下,linux内核有一个模块叫math-emu的软件模块,就是用整数运算模拟浮点数运算,一般位于arch/mips/目录下。 那么在应用空间的程序是怎么跑到该内核空间的模块呢。简单说就是,用工具链编译含有浮点运算的文件时,编译器并不知道目标板上没有FPU,所以遇到浮点运 算的时候还是将其编译成浮点运算指令。但是,编译生成的执行文件最终在执行到浮点运算指令的时候就有问题了。因为芯片没有FPU,所以浮点指令对于芯片来 说是属于不认识或者叫不支持的指令,那么他就会产生一个异常。内核在初始化的时候为这个异常设置了异常处理函数,当内核捕捉到这个异常后进入异常处理函数 执行。而这个异常处理函数就是内核浮点模拟运算模块的入口。内核将运算的结果再通过寄存器返回给系统空间,这样在应用空间来看的话就好像普通运算一样,没有什么区别。

       但是,事实上并非如此。应用空间 使用内核实现的浮点运算模块进行浮点运算 ,效率不是很高。这主要是基于两个方面,一个是因为需要反复 的产生异常从而进行应 用空间和内核空间的切换。另一个是因为,内核的浮点模拟模块效率并不高,因为异常处理时并不知道产生 异常的指令到底是加减乘除 指令,还是浮点比较等指令。 所以,他需要先用switch确定一下该指令到底需要什么运算然 后再进行模拟,最后返回运算结果。
        另外一种浮点运算的解决方案就是使用软浮点库 。方法就是在编译的时 候使用编译选项-msoft-float,然后在链接的时候加上软浮点库。软浮点库的源文件在网上应该找的到。这样 加上该编译选项后,编译器在编译浮点运算时,并不将浮点运算翻译成浮点运算指令而是,将其在编译阶段就转化成整 形数,然后调用相应的软浮点运算库中浮点运算指令模拟函数,这样一条浮点运算指令在同软浮点运算库链接完成后就 成了一堆整形数运算。这样的可执行文件能够充分的利用芯片 的流水线,而且避免了应用空间和系统空间的切换,并且运 算指令的类别判定放在了编译阶段,提高了运行阶段的效率。通常情况下,用软浮点和用内核浮点模拟模块相比,运 算效率快一个数量级,相当的可观!
       需要注意的几个问题:
        内核浮点和软浮点不能混用。 什么意思呢?比如一个工程中A库里面有函数的参数是浮点类型的,B库调用A库的这个函数,那么不能B库编译的时候带 -msoft-float,而编译A库的时候却不带(直接使用内核浮点)。或者是A库带 -msoft-float,而B库不带。通常网上很多文章说使用软浮点时,一定要使用支持软浮点的工具链,我想应该是因为使用软浮点时,工具链中很多系统 库必须是 -msoft-float选项下编译出来的,典型的就是数学库libm.a ,不然调用到该库中的函数时就可能计算错误。所以存在调用关系时,必须调用者和被调者在是否带-msoft-float选项上保持一致。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MIPS架构下linux软浮点研究 的相关文章

  • ld 链接程序出错定位

    工具链相关问题 一般可 verbose 下 看看具体什么地方出问题 设置 LDFLAGS Wl verbose 例如 链接一堆 o文件 只有以下错误信息 ld final link failed Bad value 就可以加入 Wl ver
  • Linux系统管理:虚拟机Alpine Linux安装

    目录 一 理论 1 Alpine Linux 二 实验 1 Alpine Linux安装 三 问题 1 Alpine Linux 缺少VIM命令 2 Alpine Linux SSH连接不上 3 Alpine Linux IP配置 四 总结
  • Linux下安装QT4.3.2

    安装qt是因为我刚安装过mplayer想装个前端上网 一查 很多都推崇用smplayer 我也就下决心装上 刚开始一直都装不上 后来静心读了读Install文件才明白要装smplayer必须要有qt4 2或者更高版本 用rpm qa qt才
  • fedora下一些与网络配置相关的文件和命令

    http thethe blog 51cto com 498901 145966 1 如果您在命令行下启动网络服务 应该是 root localhost beinan etc init d network start root localh
  • 记mount NFS遇到的一个问题(-o nolock)

    前两天 测试 过程中 测试机始终 mount 不上我们的 nfs 比如我使用命令 mount vt nfs share mnt share 开始是mount命令一直hang在那里 卡住了 另一种情况是 有类似如下的错误输出 portmap
  • 在linux shell中使用ftp命令来实现自动登陆、上传与下载

    前段时间有个需求 需要利用crontab定时往某个FTP上传文件 原以为linux中带的ftp命令只支持交互式的操作 没法在命令行下使用 所以后来打算利用PHP中提供的ftp命令来做 但是很不幸的发现ftp模块不是PHP的标准模块 还需要自
  • shell命令以及运行原理(详解)

    Linux严格意义上说的是一个操作系统 我们称之为 核心 kernel 但我们一般用户 不能直接使用kernel 而是通过kernel的 外壳 程序 也就是所谓的shell 来与kernel沟通 1 从技术角度 Shell的最简单定义 命令
  • Linux gdm问题解决解决

    修改 etc inittab 改变runlevel为5 例如 root QRedHat etc cat etc inittab id 5 initdefault 修改GDM的配置文件 etc X11 gdm gdm conf 将 xdmcp
  • Linux下SUDO出现Unable to resolve host XXX解决方法

    转载 Ubuntu环境 假设这台机器名字叫abc 机器的hostname 每次执行sudo 就出现这个警告讯息 sudo unable to resolve host abc 虽然sudo 还是可以正常执行 但是警告讯息每次都出来 而这只是
  • Shell脚本中字符串截取功能

    在Shell脚本编写中 有几个地方都是要用到字符串截取的功能 那将这块的内容进行下记录 1 字符串变量的截取操作 对字符串变量的截取操作一般都是通过 操作符 的方式进行 1 从指定位置index截取固定长度 格式 string start
  • Centos 7安装mysql

    1 安装前清理工作 1 1 1 清理原有的mysql数据库 使用以下命令查找出安装的mysql软件包和依赖包 rpm pa grep mysql 显示结果如下 mysql80 community release el7 1 noarch m
  • 杂项知识

    挂载 img 文件 mount t proc o loop initrd 2 6 23 1 42 fc8 img mnt img mount t debugfs o loop initrd 2 6 23 1 42 fc8 img mnt i
  • 鼠标点击页面出现富强自由等文字JS特效

    在其他博客看到一款JS特效 感觉很不错 所有网上收集过来分享给大家 效果参考本网站 添加点击特效 点击页面会显示 富强 民主 文明 和谐 自由 平等 公正 法治 爱国 敬业 诚信 友善 把以下代码添加到当前主题的head php或foote
  • Linux生产者消费者模型(POSIX信号量)

    目录 一 生产者消费者模型 1 基本概念 2 模型特点 3 模型优点 二 基于BlockingQueue的生产者消费者模型 1 基本概念 2 单生产者 单消费者为例进行模拟实现 3 基于计算任务的生产者消费者模型 三 POSIX信号量 1
  • Linux系统下搭建(更新)cuda环境

    本人之前ubuntu系统装的是cuda8 因为模型需要升级cuda 因此重新装cuda10 安装和更新cuda和cudnn以及安装和更新显卡驱动 下面操作都适合 一 安装 升级 显卡驱动 升级cuda之前 先要升级显卡驱动 登陆网页http
  • gdb 的使用总结

    1 设置动态库的路径 set solib search path PATH 如果需要设置多个路径 则在PATH直接用 冒号分隔 set solib search path PATH1 PATH2
  • spark_hadoop集群搭建自动化脚本

    bin bash 脚本使用说明 1 使用脚本前需要弄好服务器的基础环境 2 在hadoop的每个节点需要手动创建如下目录 data hdfs tmp 3 修改下面的配置参数 4 脚本执行完备后需要收到格式化namenode
  • Windows挂载Linux网络共享文件夹

    Windows挂载Linux网络共享文件夹 创建Linux网络共享文件夹 用共享工具samba Ubuntu安装samba sudo apt install samba 配置Windows访问共享文件夹的账户 smbpasswd a riv
  • Linux shell中if [ $? -eq 0 ] 语句作用:判断命令是否执行成功

    shell脚本中 是指上一次命令执行的成功或者失败的状态 如果成功就是0 失败为1 语句if eq 0 是判断if语句的上一个命令执行如果成功就执行if中的语句 否则就执行else中的内容 note 使用时要注意 if后面的中括号 eq 0
  • Fedora 10網卡消失的問題

    http itgroup blueshop com tw towns hc n convew i 6000 今天看到肉鬆Selinux的問題 想說來測試處理一下 將以備份出來的Fedora 10 VM拿出來用 啟動系統後 出現了一個怪問題

随机推荐