[AMBA]AXI原子操作(AXI Atomic Operation) 您所在的位置:网站首页 s20ultra镜头玻璃更换 [AMBA]AXI原子操作(AXI Atomic Operation)

[AMBA]AXI原子操作(AXI Atomic Operation)

2024-01-28 07:59| 来源: 网络整理| 查看: 265

AXI原子操作(AXI Atomic Operation)

       前言:原子操作就是不可中断的一个或者一系列操作, 也就是不会被线程调度机制打断的操作, 运行期间不会有任何的上下文切换(context switch)。我们为什么要关注原子操作呢? 如果确定某个操作是原子的, 就不用为了去保护这个操作而加上会耗费昂贵性能开销的锁,借助原子操作可以实现互斥锁(mutex),借助互斥锁, 可以实现让更多的操作变成原子操作。        在多核CPU的时代,体系中运行着多个独立的CPU,即使是可以在单个指令中完成的操作也可能会被干扰。典型的例子就是decl指令(递减指令),它细分为三个过程:“读 -> 改 -> 写”,涉及两次内存操作。如果多个CPU运行的多个进程在同时对同一块内存执行这个指令, 那情况是无法预测的。        软件级别的原子操作是依赖于硬件支持的,在x86体系中,CPU提供了HLOCK pin引线, 允许CPU在执行某一个指令(仅仅是一个指令)时拉低HLOCK pin引线的电位, 直到这个指令执行完毕才放开,从而锁住了总线。如此在同一总线的CPU就暂时无法通过总线访问内存了, 这样就保证了多核处理器的原子性 (想想这机制对性能影响挺大的)。        对于非long和double,基本数据类型的"简单操作"都可以看作是原子的,例如: 赋值和返回。大多数体系中long和double都占据8个字节, 操作系统或者JVM很可能会将写入和读取操作分离为两个单独的32位的操作来执行,这就产生了在一个读取和写入过程中一个上下文切换(context switch),从而导致了不同任务线程看到不正确结果的的可能性。注意:递增、递减不是原子操作,i++反汇编的汇编指令如下(需要三条指令操作, 和两个内存访问, 一次寄存器修改):

movl i, %eax //内存访问, 读取i变量的值到cpu的eax寄存器 addl $1, %eax //增加寄存器中的值 movl %eax, i //写入寄存器中的值到内存

一、原子操作的基本概念 dst_data:Memory中的数据src_data:AXI Interface中的wdatareturn_data:原子操作执行后,read回来的Memory中的data

二、原子操作的种类 return_data = dst_data + src_data;return_data = dst_data - src_data;return_data = dst_data & src_data;return_data = dst_data | src_data;return_data = dst_data ^ src_data;...

三、一个案例 通过awuser传递atomic type通过buser传回dst_data通过read Memory data来check atomic操作是否成功 四、AXI Interface用户自定义信号的使用

       如本文讲述的AXI原子操作,怎么把原子操作的类型传下去呢?院子操作是否成功,怎么放回一个flag?这些信息都可以携带在AXI用户自定义的Interface中。例如:

通过AxUSER(output)携带op_code,vf_en,vf_id,trust_level,unitid等信息通过wdatainfo(output)传递parity bit和poison flag通过buser(input)传递atomic return data,parity bit,poison flag,atomic flag等信息



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有