多核环境下软件并行设计的“锁”规避

目前,CPU以多核硬件结构存在,对比超线程:多核之间的指令运行是同时的,多线程还是时分的。如何高效使用多核呢?对于软件设计人员一个基本共识是在代码逻辑上尽量避免“锁”的存在:需要分析共享资源的竞争情况,一个典型的例子是ip路由查表问题:计算机收到一个ip包后需要提取ip包的目的ip去觉得从哪个 口发出;需要查找路由表:如果使用“读写锁”的机制:整个系统维护一个表,但需要修改表时则该表“写锁定”:其它访问该表的所有线程必须等待,也就是说并行退化为串行,只有所有线程都是读的情况下才能维持并行。更好的设计是能够让“写”发生时这样的并行特性依旧保持:一个设计是每个物理 口使用一个线程(假设一个核运行一个线程)进行收发,每个线程维护自己的路由表(读写各个线程是独立的),然后使用无锁ring方法(这个可以参考DPDK的ring设计)将要发送的数据包传递给目的 口的线程去。这样提高了整体并行性。还有微观上要重视“硬件锁”,这种特性的锁是软件人员容易忽视的:首单其冲的是内存锁:不同线程访问内存的同一个bank和rank就会相互等待(这是由于内存芯片硬件上有锁),即使从软件逻辑上看线程是并行的,但在硬件上“悄悄的”给你锁了!解决之道是尽量避免多个线程竞争同一个内存芯片,这点DPDK在自己的内存管理上有精彩的论述;第二个是IO的竞争,常见的 口属于PCI/PCIE总线的竞争,最简单的方法是让 口均匀分布到物理上不同的桥接芯片上;更深入的方法是修改 卡驱动与桥接芯片驱动,让两者尽量无缝的配合。第三是cache的管理,一般是让待处理数据的边界为cacheLine的整数倍;更深入的方法是数据/指令预提取(一般编译器会做,但你想将CPU性能发挥到极致,需要进行“锁”热点分析,然后手工去优化)。

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年6月21日
下一篇 2022年6月21日

相关推荐