2.5 事务层的请求包之原子操作



内容简介

2024-01-21

    本节内容还是事务层的请求包介绍,上一节介绍了内存事务和IO事务的请求包格式,本节着重介绍原子操作的概念和原子操作的帧格式。

1

原子操作是什么

    原子操作是PCIEv2.1引入的,在介绍PCIE的原子操作之前,有必要先介绍下什么是原子操作。原子操作是一种不可中断的操作,它在执行的过程中不能被中途打断或中断,通常用于确保多线程或多进程环境下的数据一致性和并发访问的正确性。

    举个例子,比如张三李四现在要干一件事,就是数豆子,一人一大袋子豆子,俩人共有一块黑板,要求只要数够100就更新一下,这叫对齐状态。这时候就需要注意了,不能俩人一块写,不能在自己原有的基础上写,比如张三上次一次更新到了200,下一次要更新为300了,发现已经是300了,那就得更新到400,如果发现写得是250,你就得考虑下为什么这样写,是不是要更新到350,这个就是原子操作的“test-and-set”或者“compare-and-swap”,或者说PCIE里面的CAS。

    总的来说,原子操作意味着整个读取、修改、写回的过程将被视为一个不可分割的操作。没有其他线程或进程能够在这个操作中插入,是一种确保多线程或多进程并发执行时数据一致性的机制,它使得某个操作在执行的过程中不会被其他操作打断,从而保证了程序的正确性。

2

PCIE的原子操作

    如下表是PCIE支持的原子操作,原子操作支持EP到EP,EP到RC和RC到EP这三条路径,SWITCH只是转发。PCIE支持FetchAdd、Swap和CAS三种原子操作,分别表示加、交换、比较交换三个操作。整体的实现过程如下:

第一步:源设备向目的设备发送原子操的TLP包,采样Non-Posted方式,且是基于地址的路由方式

第二步:目标设备收到数据后进行原子操作,也就是FetchAdd、Swap和CAS其中之一,这个操作过程不能被其他事务打断,也就是必须我先干完,这样才保证了原子操作

第三步:目的设备操作完毕后给源设备发送完成包,具体包格式下一节介绍。

原子操作可以是3DW也可以是4DW,但数据长度或者按照《PCIE导读》说法操作数是有限制,如下表所示。


1

FetchAdd操作

    支持32bit或64bit操作数,1DW对应32bit,2DW对应64bit,实现的功能是将目的设备的原始数据与TLP包中的操作数相加,并得到一个新数据,将新数据写入指定内存区域,并使用完成报文返回内存地址中的原始数据。

2

对于Swap操作

    支持32bit或64bit操作数,1DW对应32bit,2DW对应64bit,主要实现基于TLP中的地址值的数据交换,根据TLP包的指定地址读取内存数据,将TLP包中的操作数写入TLP包指定内存,并使用完成报文返回内存地址中的原始数据。

2

对于CAS操作

    CAS即compare and swap,支持32bit、64bit或128bit操作数,2DW对应32bit,4DW对应64bit,8DW对应128bit,这点与之前定义的不同,因为操作数2个,包括compare 阶段和swap阶段。首先将TLP指定的目的设备的内存地址的原始数据与compare 的操作数进行对比,如果相等将swap的操作数写入TLP地址的指定内存,并使用完成报文返回内存地址中的原始数据。

















快来扫描下方二维码关注公众号,领取站内所有相关资料,所有哦~

有建议、有需求、有疑问、联系我

<