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

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                          //写入寄存器中的值到内存

一、原子操作的基本概念

  1. dst_data:Memory中的数据
  2. src_data:AXI Interface中的wdata
  3. return_data:原子操作执行后,read回来的Memory中的data

二、原子操作的种类

  1. return_data = dst_data + src_data;
  2. return_data = dst_data - src_data;
  3. return_data = dst_data & src_data;
  4. return_data = dst_data | src_data;
  5. return_data = dst_data ^ src_data;
  6. ...

三、一个案例

  1. 通过awuser传递atomic type
  2. 通过buser传回dst_data
  3. 通过read Memory data来check atomic操作是否成功

四、AXI Interface用户自定义信号的使用

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

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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部