基于元神操作系统编写(FPU)数学计算程序

news2024/9/21 14:27:50

1. 背景

数学计算已经成为计算机的主要工作之一,尤其是实数运算,在人工智能时代更是普遍存在,神经网络中的绝大部分参数都用的实数。

2. 方法

(1)FPU运算

计算机中的实数运算是通过数学协处理器FPU完成的,采用FPU特定的指令进行编程。实数在存储时采用的是IEEE 754标准的浮点形式,对于32位的单精度浮点数而言,最高位是实数的符号位,接下来的8位是阶码,低23位是有效数字,例如,浮点数0.5的32位表示为3F000000,即0 01111110 00000000000000000000000。关于IEEE 754标准及浮点数的编码规则,可以搜索专门介绍的材料进行学习了解。

(2)调用API实现sin计算

本例通过调用元神操作系统的API来实现正弦函数计算功能,代码如下所示:

use32

START:
	pusha
	
	call demo_float
	
	popa
	iret

include 'api_def.inc'

OS_API equ 0x00030C16
API_PARAM equ 0x03000000
cursor_x equ 0x02004B10
cursor_y equ 0x02004B12

value dd 0.5
demo_float:
	pusha
	
	mov eax, [value]
	movzx ebx, word [fs:cursor_y]
	movzx ecx, word [fs:cursor_x]
	call print_dword
	
	mov edi, API_PARAM
	mov dword [fs:edi], API_SIN
	mov dword [fs:edi+4], 1
	mov dword [fs:edi+8], eax
	mov dword [fs:edi+12], 0
	call pword [fs:OS_API]
	
	mov eax, [fs:edi+12]
	add ecx, 10
	call print_dword
	
	add word [fs:cursor_y], 1
	
	popa
	ret
	
;print dword value
;input:
;	eax: value to print
;	ebx: y position to print
;	ecx: x position to print
print_dword:
	pusha
	
	imul edi, ebx, 80*2
	add edi, ecx
	add edi, ecx
	add edi, 14
	mov ecx, 8
	mov edx, eax
	mov ah, 0x0F
 .next_char:
	mov al, dl
	shr edx, 4
	and al, 0x0F
	add al, 0x30
	mov word [gs:edi], ax
	sub edi, 2
	loop .next_char
	
 .end:
	popa
	ret

将上述代码保存为demo.asm,编译生成可执行文件demo.bin,然后将该文件复制到元神操作系统所在U盘的根目录,使用该U盘启动元神操作系统,并在命令行输入命令“zx demo.bin”来执行该程序,结果如下图所示:

对照代码,本例定义了一个叫做value的4字节(单精度浮点数)变量,其值为0.5,之后将该值作为参数调用OS_API,同时作为参数的还有API类型API_SIN、API参数个数1,计算结果存放在输入参数之后。因为要调用API_SIN,所以api_def.inc文件中需要有相应的定义,如下所示:

API_SIN		equ	0x00000001

在API调用前打印了输入参数值,即3F000000;API调用结束后,又打印了对应的正弦值,即3EF57744。这两个浮点数都是编码过的,不够直观,有想法的可以自行编写程序实现编解码过程,将之转换为浮点数字符串,如“0.5”这种。不过,这种代码编写起来不容易,而且执行耗时也较多。

另外,本例的打印函数print_dword只做了简单的处理没有将11~15转换为A~F,而是直接在‘0’的基础上加了10~16,所以对应的输出实际是标点符号,所以才会看到F显示成了?,若想实现完美的输出程序,可自行修正demo程序。

(3)不调用API实现浮点计算

上述功能也可以不通过API实现,差异部分代码如下所示:

demo_float:
	pusha
	
	mov eax, [value]
	movzx ebx, word [fs:cursor_y]
	movzx ecx, word [fs:cursor_x]
	call print_dword
	
	fld dword [value]
	fsin
	fstp dword [fs:API_PARAM+12]
	
	mov eax, [fs:API_PARAM+12]
	add ecx, 10
	call print_dword
	
	add word [fs:cursor_y], 1

	popa
	ret

本例直接使用了FPU指令,先用fld指令将0.5加载到FPU寄存器,然后用fsin指令执行正弦计算,最后用fstp指令将计算结果从FPU寄存器保存到内存中,运行结果和上例相同。

3. 总结

浮点运算现在已经普遍存在,但其运算速度较慢。FPU只能实现浮点数的部分运算功能,但是受限于硬件限制,无法加速浮点运算,所以,若想执行人工智能模型训练这种大规模的浮点运算,会非常缓慢。本文仅介绍了浮点运算的实现演示,没有在运算速度上多做考虑。另外,若想将IEEE 754编码的浮点数转换为直观的浮点数字符串(或逆向转换),也需要不少的代码,并且频繁的来回转换也会在执行时消耗很多的时间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2075215.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黑神话悟空配置要求:CPU/内存/显卡/存储和系统最低限制

玩《黑神话:悟空》对电脑配置有什么要求?至少需要i5处理器、16G内存、GTX 1060显卡、130G空闲磁盘空间,没有高配电脑怎么办?码笔记整理详细配置如下: CPU处理器:64位处理器,CPU选择Intel Core …

数据防泄密知识集锦丨八个实用数据防泄露软件,你知道吗

数据已成为企业的核心资产。 然而,随着网络威胁的日益严峻,数据泄露事件频发,给企业带来了巨大的经济损失和声誉风险。 为了有效保护企业数据的安全性和保密性,各种数据防泄露软件应运而生。 本文将为您介绍八个实用的数据防泄露…

ROS机器人专用云台相机防抖摄像头

【告别模糊】机器人专用摄像头,为您的视觉算法保驾护航 产品概述 Autolabor C1专为机器人设计的高性能摄像头,即使在没有减震装置或不平坦的路面上,也能提供清晰稳定的图像。它拥有先进的主动式机械防抖和数字ISP防抖技术,图像效…

基于太阳能供电的水情监测站设计(论文+源码+图纸)

1.总体方案设计 根据水情监测站系统的实际应用需求,从硬件电路以及软件程序两个方面展开系统设计。按照系统设计功能以及功能选型的结果,制定了如图2.11所示的系统总体框图。系统采用STM32单片机作为控制器,在传感器检测模块中包括的DS18B20…

netty编程之使用ChannelOutboundHandler对write出去的消息做不同处理

写在前面 源码 。 在进行网络编程的时候,不可避免的需要对write出去的消息做一些处理,比如脱敏,增加统一数据等。而netty提供了ChannelOutboundHandler来允许我们拦截消息从而可以对消息进行处理。对应的接口是io.netty.channel.ChannelHand…

Python:win10下一种不用编译,直接下载二进制依赖的方法

python依赖的安装,在win环境下, 有些包还是比较麻烦, 经常编译失败, 我曾发帖讨论过多次,有帖为证!点此进入! https://blog.csdn.net/weixin_62598385/article/details/135945383 win下的Pyth…

基于vue.js和node.js的酒坊销售网站的设计与实现---附源码98047

目 录 摘要 1 绪论 1.1研究背景与意义 1.3研究内容 1.4论文结构与章节安排 2 酒坊销售网站分析 2.1 可行性分析 2.2系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例…

实战分享:利用两大在线平台实现自动化数据采集的技巧

本文将深入探讨如何运用两大主流在线平台,通过实战案例分享,揭示自动化数据采集的高效技巧。无需编程基础,也能快速掌握跨平台数据抓取秘籍,助力企业和个人提升市场竞争力与决策效率。 正文 在大数据时代背景下,信息…

ESP8266通过WiFiManager实现Web配网

背景 一个项目中使用到了一款压力传感器,需要通过单片机实现数据的采集并发送到远程的服务器上,单片机采用的时ESP8266,通过WiFiManager实现局域网配置,以及远端服务器IP地址和服务端口的配置。发布此文章记录一下使用WiFiManager实现配网的方法。 程序流程图 示例代码 …

如何下载GB2312字体,免费

因为写文章需要用到,然后wps里面这个是收费的,所以我就去找了免费的,现在分享给大家。 因为我看网上很多都是给一个网址,有些网址已经坏了,所以我这里给一下我的链接 链接:https://pan.baidu.com/s/1wiyF…

如何用Java SpringBoot+Vue构建高效的产品订单管理系统

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

python 爬虫,东方网 上海新闻, 简单数据分析

起因: 本来想去市区玩玩,结果搜到一些相关的新闻,所以就想爬取新闻网站… 1. 爬虫部分 import os import csv import time import requests""" # home: https://sh.eastday.com/ # 1. 标题, url, 来源,时间 &qu…

SQL进阶技巧:近距离有效的缺失值填充问题【last_value实现版】

目录 0 场景描述 1 数据准备 2 问题分析 3 小结 0 场景描述 场景:现在有一张商品入库表,包括商品id、商品成本和入库日期3个字段,由于某些原因,导致部分商品的成本缺失(为0或者没有值都是缺失),这样不利于我们计算成本。所以现在要把缺失的商品进价补充完整,补充的…

Redis远程字典服务器(12)—— 使用C++操作Redis

目录 一,环境配置 1.1 介绍 1.2 安装hiredis 1.3 安装redis-plus-plus 1.4 连接服务器 二,使用通用命令 2.0 StringView,和OptionalString类型 2.1 set,get, 2.2 exists,del 2.3 keys 2.4 expi…

【秋招笔试】8.25拼多多秋招-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…

【测试】JMeter从入门到进阶

本文参考 Jmeter自动化测试工具从入门到进阶6小时搞定,适合手工测试同学学习_哔哩哔哩_bilibili JMeter介绍 JMeter 是 Apache 组织使用 Java 开发的一款测试工具: 1、可以用于对服务器、网络或对象模拟巨大的负载 2、通过创建带有断言的脚本来验证程序…

C3-80螺栓介绍及其特性

C3-80 螺栓作为马氏体不锈钢高强度紧固件的一员,在工程应用中扮演着重要角色。它不仅具有较高的强度,还拥有良好的耐腐蚀性能,适用于多种恶劣环境下的工业应用。 C3-80螺栓概述 C3-80螺栓是一种马氏体不锈钢材质的高强度紧固件,其…

电商数据怎么分析?电商数据接口助力电商运营中每日必看5个底层数据

数据分析充电站——深入探索中小企业数字化转型,专注提供各行业数据分析干货、分析技巧、工具推荐以及各类超实用分析模板,为钻研于数据分析的朋友们加油充电。 电商运营店铺涉及大量数据,包括用户行为、交易记录、库存信息等,如何…

【C++八股题整理】虚函数

C八股题整理 - 虚函数 虚函数虚函数的定义?C11引入的override和final关键字的作用?虚函数的实现原理?虚函数表(vbtl)和虚函数表指针(vptr)虚函数表、虚函数表指针的生成时期及存储位置&#xff…

JS常用事件示例

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>JS函数中的事件</title> <…