Rocket - tilelink - Atomics

https://mp.weixin.qq.com/s/TSwKL_qm-b-0e8x7r--hhg

 
简单介绍Atomics中数学运算、逻辑运算的实现。
 
 
1. io
 
Atomics是一个硬件模块,他继承自Modules:
 
IO端口定义如下:
其中:
a. write: 是否写操作;
b. a:输入操作类型及一个操作数;
c. data_in:输入另一个操作数;
d. data_out:输出计算结果;
 
2. Arithmetic params
 
处理channel a传入的params:
 
Channel A上的ArithmeticData消息的params定义如下:
对应代码,可以看到params各比特的意义:
a. io.a.params(2):如果这一位为1,则表明运算为加法运算;
b. io.a.params(1):如果这一位为1,则表明为无符号运算;
c. io.a.params(0):如果这一位为1,则表明为取最大值运算;如果为0,则为取最小值运算;
 
3. Arithmetic
 
数学运算逻辑的实现如下:
 
1) signBit
 
io.a.mask中的每一位对应着io.a.data中的一个字节。mask中为0的位对应的字节无效,不参与运算。mask中为1的位对应的字节才可以参与运算。那么io.a.data的符号,则由io.a.mask中最高的值为1的位对应的字节决定。
 
signBit的意义即为取出mask中最高的一个为1的位。只有mask中最高的值为1的位对应的比特值为1,其余比特的值都为0。这样可以作为掩码选出io.a.data中决定符号的字节。
 
这个左移一位相与的实现,有一个隐含条件:mask中值为1的比特要连续。
 
这一点由规范中对io.a.mask的要求来满足:
 
2) inv_d
如果是加法,则直接使用原值即可。如果是减法,则需要取反加一。
 
3) sum
 
相加:
a. 把io.a.mask中的每一位扩展为8位:FillInterleaved(8, io.a.mask)
b. 使用扩展之后的掩码去掩io.a.data,把无效的字节掩掉:FillInterleaved(8, io.a.mask) & io.a.data
c. 与inv_d相加: + inv_d
 
根据inv_d的取值,决定结果是和还是差:io.a.data - io.data_in = io.a.data + ~io.data_in + 1。
所以如果sum是差值,那么还需要加1才是真正的差值。
 
4) sign
 
计算输入参数的符号:
a. 输入参数x是一个UInt;
b. 取出x中每一个字节的最高位:x.toBools().grouped(8).map(_.last).toList
c. 把最高位组成一个UInt;
d. 取出最高有效字节的最高位:& signBit
e. 以Bool类型输出最高位:.orR()
 
5) pick_a
 
如果运算是比较大小的话,是选择第一个参与比较的数字a,还是选择比较对象d:
如果选择较大的数,而a大于d则选择a;
 
6) a_bigger
 
a是不是比d大:
 
a. 如果a和d的符号不同,则取决于a_bigger_uneq的值,这个下面介绍。
 
b. 如果a和d的符号相同,则取决于两者之差的符号,即取决于sum的符号,及sign_s的值。
 
这里的一个小trick是sum并不是真正的差值,而是差值减了1的值。即:
 
sign_s是sum的符号,sign_s == 0等价于sum >= 0:
a - d >= 1的情况下,a一定大于d,不包括a == d的情况。
 
这里利用了a == d的情况下,取a或者d都是一样的,来规避求差值需要减1的逻辑消耗。
 
7) a_bigger_uneq
 
这个名字中的uneq意思就是a和d的符号不同:
A. 如果unsigned == 1:
a. 如果sign_a == 1,那么sign_d == 0,a更大,a_bigger_uneq == 1;
b. 如果sign_a == 0,那么sign_d == 0,a更小,a_bigger_uneq == 0;
 
B. 如果unsigned == 0:
a. 如果sign_a == 1为负数,那么sign_d == 0为正数,a更小,a_bigger_uneq == 0;
b. 如果sign_a == 0为正数,那么sign_d == 0为负数,a更大,a_bigger_uneq == 1;
 
可以看到a_bigger_uneq可以很好的表示两个数值的大小。
 
4. Logical
 
Logical的计算比较简单,把第一个参数和第二个参数相应的位组合在一起,总共有四种情况,组成序号0/1/2/3,根据这个序号去查表即可得到逻辑运算的结果:
 
5. 运算结果输出
 
可能输出的有四个值:0=d, 1=a, 2=sum, 3=logical
 
根据每一种操作(io.a.opcode决定)所需要值确定一个序号,然后再使用这个序号从序列中取值即可:
这里根据io.a.mask,逐个字节取值。无效字节使用io.data_in中的值。

转载于:https://www.cnblogs.com/wjcdx/p/11211457.html

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

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

相关文章

“勤学会”火爆来袭

文章目录勤学会是什么?勤学会存在的意义是什么强大的助学团勤学会如何帮助大家学习参与勤学会能得什么奖品专属C计划加入勤学会勤学会是什么? 他来了他来了,其实两个月前勤学会的概念产品就已经出现了,只不过因为了 1024 大型活动…

LeetCode -- 204. Count Primes

题目标签 HashTab(哈希表) 题意及思路 题意:略 思路:有关素数的题目我所知道有两种做法。一种是最基本的isPrime算法,关键点在循环判断时,上限为Math.sqrt(n) (求n是否为素数)。另外…

如何寻找无序数组中的第K大元素?

如何寻找无序数组中的第K大元素? 有这样一个算法题:有一个无序数组,要求找出数组中的第K大元素。比如给定的无序数组如下所示: 如果k6,也就是要寻找第6大的元素,很显然,数组中第一大元素是24&am…

测试MongoDB的自动分片

MongoDB的自动分片: test库分片配置: db.shards.find(){ "_id" : "shard0000", "host" : "127.0.0.1:29017", "state" : 1 }{ "_id" : "shard0001", "host" : "1…

线上CPU飚高(死循环,死锁……)?帮你迅速定位代码位置

top基本使用: top命令参考本篇文章 查看内存和CPU的top命令,别看输出一大堆,理解了其实很简单 top 命令运行图: 第一行:基本信息 第二行:任务信息 第三行:CPU使用情况 第四行:物理内…

zookeeper watch笔记

ZK其核心原理满足CP, 实现的是最终一致性, 它只保证顺序一致性. zookeeper 基于 zxid 以及阻塞队列的方式来实现请求的顺序一致性。如果一个client连接到一个最新的 follower 上,那么它 read 读取到了最新的数据,然后 client 由于网络原因重新连接到 zoo…

单机简单搭建一个kafka集群(没有进行内核参数和JVM的调优)

1.JDK安装 在我的部署单节点kafka的博客里有相关的方法。(https://www.cnblogs.com/ToBeExpert/p/9789486.html )zookeeper和kafka的压缩包下载地址也在单节点部署的这篇博客里。 1.zookeeper集群的搭建 将zookeeper.tar.gz解压为三个目录,例…

[翻译]三张卡片帮你记住TDD的基本原则

原文地址:http://blog.briandicroce.com/2008/03/14/three-index-cards-to-easily-remember-the-essence-of-test-driven-development/ 当我浏览ObjectMentor的博客的时候,其中一篇Tim Ottinger的“TDD on Three Index Cards”引起了我的注意。他回忆了他…

凉哥核心圈程序员必备十大图书推荐(一)

写在前面 凉哥核心圈程序员必备十大图书推荐(一),各位伙伴应该一目了然了哈,没错凉哥准备出一系列图书推荐的文章,其实很多朋友在私下问凉哥除了大学的课程外自己要不要读一些技术类的书籍呢,答案当时要的…

了解大数据的特点、来源与数据呈现方式

本次作业来源于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2639 1.浏览2019春节各种大数据分析报告,例如: 这世间,再无第二个国家有能力承载如此庞大的人流量。http://www.sohu.com/a/290025769_313993春节人口迁…

强大而优雅,API 研发管理 EOLINKER 新版正式发布!

EOLINKER 于2019年3月3日正式发布新版本!该版本大幅强化各个产品的功能、着重优化了全站的用户交互体验,并且EOLINKER AMS 产品正式更名为 EOLINKER API Studio ——API 工作室,旨在为您提供API文档管理、自动化测试以及开发协作等全方位服务…

MATLAB 与 Excel 接口

MATLAB 与 Excel 接口MATLAB 与 Excel 有两种接口方式:一种是通过 MATLAB 提供的 Excel 生成器,生成220 MATLAB 实用教程DLL 组件和 VBA 代码,实现 Excel 对 MATLAB 的调用;另一种是利用 MATLAB 提供的 Excellink 插件&#xff0c…

计算 1+2!+3!+4!+...20!=?

package algs.factorial;import java.math.BigInteger;/*** Author: areful* Date: 2019/3/6* 计算 sum(n!), n1,2, ... 20*/ public class NFactorial {public static void main(String[] args) {System.out.println(calcFactorial0(3));System.out.println(calcFactorial1(3)…

区块链基础语言(三)——Go语言开发工具

一、在Windows系统安装Goland 1.1 下载 官网地址&#xff1a;https://www.jetbrains.com/go/download/#sectionwindows 1.2 安装 a. 双击“goland-2018.1.5.exe”&#xff0c;单击“运行”&#xff0c;如图1所示&#xff1b; <图1> b. 如图2所示&#xff0c;单击“next”…

准备重新开始写了

工作很忙,而且前一段时间项目组由于方向和人员调整一直很动荡,所以就没有心情和时间来整理技术.准备重新开张了,好好写,争取每个月出一到两篇说得过去的文章.转载于:https://www.cnblogs.com/sun/archive/2008/06/12/1218220.html

Georgia and Bob POJ - 1704 阶梯Nim

$ \color{#0066ff}{ 题目描述 }$ Georgia and Bob decide to play a self-invented game. They draw a row of grids on paper, number the grids from left to right by 1, 2, 3, ..., and place N chessmen on different grids, as shown in the following figure for exampl…

Tomcat总结

Tomcat调优原理&#xff1a; 1、增加最大连接数&#xff08;增大值避免队列请求过多&#xff0c;导致响应缓慢&#xff09; 2、调整工作模式 Bio(BlockingI/O)&#xff1a;默认工作模式&#xff0c;阻塞式I/O操作&#xff0c;没有任何优化技术处理&#xff0c;性能比较低。Nio(…

JVM的监控工具之jstack

参考博客&#xff1a;https://www.jianshu.com/p/213710fb9e40 jstack&#xff08;Stack Trace for Java&#xff09;命令用于生成虚拟机当前时刻的线程快照&#xff08;一般称为threaddump或者javacore文件&#xff09;。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈…

liunx驱动----异步通知

查询&#xff1a;消耗资源 中断&#xff1a;read 一直要去读poll &#xff1a;指定起始时间异步通知signal 测试程序include <stdio.h> include <signal.h>void my_signal(int signum) {static unsigned int cnt;printf("signum %d, %d timer\n",signum…

Niginx 集群负载均衡策略

Niginx 集群负载均衡策略 所需物料 1.Nginx服务 步骤略 本人 nginx version: nginx/1.16.0 2.Java Servlet 测试项目 新建java web 项目&#xff0c;项目名称为&#xff1a;tt import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annot…