首页 理论教育PCIExpress原子操作简介

PCIExpress原子操作简介

【摘要】:PCIe V2.1总线规范引入原子操作的概念,原子操作仅能在存储器访问中使用。PCIe设备使用一次原子操作可以实现之前需要多次数据操作才能完成的数据交换任务,除此之外PCIe设备使用原子操作还可以避免使用带锁的PCIe总线事务。这一过程不可被其他总线事务中断,PCIe设备保证这一过程为原子操作。目前,PCIe总线共支持3种原子操作,分别为FetchAdd、Swap和CAS原子操作。使用完成报文返回PCI总线地址中的原始数据。

PCIe V2.1总线规范引入原子操作的概念,原子操作仅能在存储器访问中使用。其中RC和EP可以作为原子操作的请求者和接收者,而Switch和多端口RC支持原子操作的转发。PCIe总线支持三类原子操作,分别是EP-to-EP,EP-to-RC和RC-to-EP的原子操作。

原子操作有利于提高智能设备[25]之间以及智能设备与处理器之间的数据传递效率。当智能设备与处理器进行数据交换时,将不可避免地使用某种锁机制访问临界资源。传统的做法是使用“带锁的”存储器总线事务实现这些锁机制。而使用原子操作可以在很大程度上降低“带锁的”存储器读写请求TLP的使用,从而提高PCIe总线的使用效率。

PCIe设备使用一次原子操作可以实现之前需要多次数据操作才能完成的数据交换任务,除此之外PCIe设备使用原子操作还可以避免使用带锁的PCIe总线事务。原子操作的基本过程如下所示。

(1)源设备向目标设备发送原子操作请求TLP。原子操作请求TLP使用Non-Posted方式进行数据传递,且使用基于地址路由方式。

(2)当目标设备收到这个原子操作请求TLP之后,将从这个TLP指定的存储器空间中读取原始数据。

(3)目标设备将“原始数据”与“原子操作请求TLP中包含的操作数”进行某种规定的运算后产生一个新的数据。这一过程不可被其他总线事务中断,PCIe设备保证这一过程为原子操作。这个步骤对于原子操作至关重要,也是原子操作的实现要点。

(4)当上述原子操作执行完毕后,目标设备使用原子操作完成报文向源设备传送数据,并将这个新的数据写入目标设备的存储器空间中。原子操作完成报文与存储器读完成的传递方式类似。

由以上分析,可以发现所谓原子操作是指PCIe设备“读取原始数据”、“运算”和“产生新的数据”这三个过程不可被其他操作打断。这三个过程将在目标设备中一次完成,并由目标设备的硬件逻辑保证这三个过程不会被其他TLP干扰。

由上文所述,一个完整的原子操作由原子操作请求TLP和完成TLP组成。其中原子操作请求TLP的报文头与存储器请求TLP类似,如图6-8所示。原子操作请求TLP具有Data Payload字段,在Data Paylaod中包含原子操作请求TLP使用的操作数。

目前,PCIe总线共支持3种原子操作,分别为FetchAdd、Swap和CAS原子操作。不同的原子操作使用的操作数个数并不相同,其中FetchAdd和Swap原子操作使用一个操作数,而CAS原子操作使用两个操作数。

1.FetchAdd操作

FetchAdd操作支持32b或者64b的操作数。如果该TLP的Length字段为1DW时,操作数的长度为32b;如果该TLP的Length字段为2DW时,操作数的长度为64b。FetchAdd操作的执行过程如下所示。

(1)PCIe设备从TLP的指定PCI总线地址中获得原始数据。

(2)将原始数据与TLP中的操作数相加,并得到一个新的数据。相加的结果忽略进位与溢出位。

(3)将这个新的数据写入TLP指定的PCI总线地址中。(www.chuimin.cn)

(4)使用完成报文返回指定PCI总线地址中的原始数据。

2.Swap总线事务

Swap操作也支持32b或者64b的操作数,其原则与FetchAdd操作完全一致。Swap操作的执行过程如下所示。

(1)PCIe设备从TLP指定的PCI总线地址中读取原始数据。

(2)将TLP中的操作数写入TLP指定的PCI总线地址。

(3)使用完成报文返回PCI总线地址中的原始数据。

3.CAS总线事务

CAS操作支持32b、64b或者128b的操作数。如果该TLP的Length字段为2DW时,操作数的长度为32b;如果该TLP的Length字段为4DW时,操作数的长度为64b;如果该TLP的Length字段为8DW时,操作数的长度为128b。CAS总线事务含有两个操作数,分别为“Compare”和“Swap”。CAS操作的执行过程如下所示。

(1)PCIe设备从TLP指定的PCI总线地址中获得原始数据。

(2)将原始数据与“Compare”操作数进行比较。

(3)如果结果相等,则将“Swap”操作数写入TLP指定的位置。

(4)使用完成报文返回PCI总线地址中的原始数据。

智能设备之间以及智能设备与处理器之间如果需要使用“Spin Lock”操作时,可以使用CAS原子操作实现。值得注意的是,在x86处理器的指令集中,也含有CAS类指令,该指令是实现“Spin Lock”的基础。但是在处理器系统中使用的“Spin Lock”操作与智能设备使用的“Spin Lock”操作在实现上有所不同。