相较于单播,组播能够把数据发给一组设备,避免了发送重复的数据流,能够提升系统传输性能;相较于广播,组播具有更好的指向性和安全性。更多PICe组播的益处,请参考 《Why PCIe-Based Systems Need Multicast》。
下图(图1)是一个日常使用PCIe组播的例子。本例中,作为EP的视频设备同时发送视频数据到显示器及两个存储器。
图1 组播系统举例
图3 组播扩展能力结构
具备PCIe组播能力的switch需要实现组播扩展能力结构,组播扩展能力结构如图1所示。组播扩展能力结构中的寄存器及其用途如下:
图4 组播扩展能力头标
图5 组播能力寄存器
图6 组播控制寄存器
图8 组播接收控制寄存器
图9 组播阻塞所有事务控制寄存器
图10 组播阻塞透明传输控制寄存器
图11 MC_Overlay_BAR register
组播事务的多个最终接收者组的播窗口大小是很有可能不同的。一个极端例子,某个组播窗口需要的窗口大小可能会覆盖整个设备的存储空间范围。反之,某个组播窗口大小可能仅需要覆盖FIFO寄存器内一小段特定的偏移。为了应对这种情况,EP通过设置其组播能力寄存器内的组播窗口大小域MC_Window_Size_Requested来表明该EP需要的窗口大小。
对于缺少IOMMU的嵌入式系统而言,把组播窗口内存空间配置得与主机内存直接重叠反倒更灵活一些。
根据实际需求,支持组播能力的多RP的RC中可以实现多个组播能力结构。若需要多个组播能力结构,软件应设置每个组播结构中的各个域。为了支持到RCiEP的组播,实现时需要把所有经MC_Base_address确认过的组播TLP暴露给RCiEP内所有潜在的组播目标EP。RCiEP依据其组播能力结构内的MC_Receive寄存器来决定是否接收该TLP。
组播能力结构中部分域支持随时更新,包括MC_Enable, MC_Num_Group, MC_Receive, MC_Block_All, MC_Block_Untranslated。在更新这些域的值的时候必须按顺序更新。采用相同TC的两笔TLP A和B先后从相同入端口到达,若A在某个组播域把值更新为X,则B相同域也应更新为X或者采用更新的值。
除可随时更新的域之外,其他域只有在组件内所有function的MC_Enable都清零后才能更新,这样的组播域有MC_Base_Address, MC_Index_Position。
📌 PCIe组播事务需满足以下三个条件:
在支持组播的交换节点所有function及多function上行端口中,应把MC_Enable、MC_Base_Address、MC_Index_Position及MC_Num_Group等相同的域通过软件配置为相同的值,这样交换节点入端口及其他组件可以使用其任意一个function的MC相关域的值。如若不然,入端口就有可能取到不同的值而导致不确定的情况发生。
对于switch及RC,若TLP在该组件中没有被阻塞,且从TLP提取出的MCG在MC_Receive寄存器中的对应位都有置一,那么该TLP会被前推到该组件除入端口外的所有端口;对于EP,该TLP会被所有function接收;若没有port前推或function接收该TLP,该TLP会被静默丢掉。
为了防止形成组播环路,即便RP或Switch Port的MC_Receive设置符合转发条件,也绝对不能沿入端口推回该TLP。有一个例外,若RC收到了一笔单播请求且刚好落在了其组播窗口内,这时RC可以沿其该请求进入RC的相同入端口反向前推该请求。
同样,建议多function设备EP都能够实现组播能力结构。
组播事务没有其独特的排序方法。组播事务为转发请求,遵循转发请求相关的排序规则。
若组播事务被MC_Block_All或MC_Block_Untranslated机制阻塞住了,该笔事务会被丢弃。阻塞住该笔事务的function就是该事务的完成者,完成者必须按照常规的错误处理方式记录并上报MC_Blocked TLP错误。此外,完成者必须在其状态寄存器或第二状态寄存器合适的地方将Signaled Target Abord位置一。为了隔离错误并分析错误原因,强烈建议在具有组播能力的function内实现AER。
在RC或switch内,如果入端口接收TLP时发生错误,则由入端口上报错误。若EP function在准备发送TLP的过程中出现错误,则由EP function上报错误。
MC_Overlay机制下的ECRC如下表(表1)所示。
表1 MC_Overlay ECRC规则
对于开启了MC_Overlay机制但不支持ECRC重构的端口,可以穿过端口的组播TLP中剥离ECRC,这是接收端EP可以开启ECRC校验。这种情况下,EP将受益于非组播TLP的ECRC,而不用检测MC_Overlay机制修改过后的组播TLP的ECRC。
组播的使用增加了switch输出链路的使用率,组播组的越大、组播流量在总流量中占比越大,输出链路的使用率越高。这无疑会增加拥塞的风险。为了减小组播造成的拥塞风险,有意作为组播目标的组件应把组播TLP的处理速度设计得足够快(线速),有意作为组播源头的组件也应有对应机制组播发出的速度(不要过快)。
在许多应用程序中,应用程序的组播数据流会有一个固有的速率且不会造成拥塞。此外需要明确的机制来组播注入的速率,需要选择带有足够缓冲区的switch以在未开启流控的情况下存放burst组播数据,或选择一个能够以所需速率处理组播事务的目标组播组件。选择一套好的机制及组件来服务于应用,这是一个好的系统设计者应做到的。
❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- howto1234.com 版权所有 湘ICP备2023017662号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务