从零学习 InfiniBand-network架构(八) —— IB协议中的原子操作
🔈声明:
😃博主主页:王_嘻嘻的CSDN主页
🔑未经作者允许,禁止转载
🚩本专题部分内容源于《InfiniBand-network architecture》,侵权必删
本章将介绍IB协议中传输请求中的原子操作,并解释原子操作存在的意义以及IB协议中原子操作的具体类型与流程。
什么是原子操作
原子(atomic),在信息领域中指的就是不可分割的操作,不会因为线程调度被打断的操作。在IB协议中,原子操作指:如果一个处理器必须对特定的内存区域(例如,一个数据结构)执行一系列的两次或两次以上的访问,需确保在该处理器的一系列访问完成之前没有其他处理器访问同一内存。
通过这种方式,原子操作的任务已经为自己保留了资源,然后可以启动一系列数据结构访问,而不必担心另一个任务成功访问该数据结构。
原子操作的意义
假设系统中不存在原子操作:
- 任务A在处理器A上运行,任务B在处理器B上运行;
- 任务A必须访问共享数据结构;
- 处理器A启动并完成一次内存读取,检查目标内存的状态,并标记该空间其它任务不可用;
- 任务A然后执行存储指令将更新的信号量放回内存中;
- 同时,运行在处理器B上的任务也希望访问该空间,但它可能在处理器a之前获得对信号量位置的访问权;
- 此时,任务A和任务B现在都认为数据结构只属于它们,数据将进入无法预测的状态;
出现上述问题将导致整个系统陷入糟糕的状态,这不是设计人员希望看到的。
如果处理器A能够执行内存读、值测试和寄存器中的设置,以及作为原子的、不可分割的操作的内存写,并确保在原子系列访问(在本例中,是内存读和内存写)完成之前没有其他实体访问同一内存区域,那么这种情况是可以避免的。
IB协议中原子操作的类型与流程
为了解决上述问题,IB协议提供了两种原子操作:
- fetch and add的原子操作;
- Compare and Swap If Equal的原子操作(同Java中的CAS);
原子操作由请求和Ack包组成,一个由请求方QP的SQ逻辑发出的原子请求包和一个由响应方QP的RQ逻辑返回的原子确认包,但是这两个数据包都不包含数据有效负载字段。操作所需的数据项在报文的AtomicETH字段中携带,AtomicETH字段包含:
- 虚拟内存地址(VA);
- 远程访问键(R_Key);
- 添加数据(在Fetch和Add操作的情况下),或比较数据和交换数据(在比较和交换如果相等操作的情况下);
IB协议规定了在接收到原子请求包时,响应端QP的RQ将其发布到特定于设备的队列中,(由硬件,而不是软件来执行),在内存读写之间的时间间隔内,CA必须阻止同一CA上的其他QP访问同一位置。
以fetch and add操作为例,具体流程如下图:
- 从响应端内存中可被8整除的虚拟地址开始的内存中读取64-bits值;
- 使用请求包的AtomicETH字段中提供的64位add Data字段执行无符号添加;
- 将结果写回相同的虚拟地址;
Compare and Swap操作与fetch and add操作类似,在此就不再详细描述。
搜索关注我的公众号【IC墨鱼仔】,获取我的更多IC干货分享!