[讨论]上次浙大linux 内核大会提的lock性能优化对cpu cache的改

yupluo
yupluo 08月26日 字数 235

好像是阿里做kernel的专家, 提到x86 处理器cpu cache实现对lock性能有改进的地方。 当时没说具体细节。

是atomic instructions支持的不好吗?我的理解 x86下没有arm的LL/SC的方式,只有atomic指令:建议实现上采用near atomic,而不是far atomic的方式?

CSArch 计算机体系结构
11 个回复
MaLing
uranus 08月26日

https://patents.google.com/patent/CN104951240B/zh?inventor=%E9%A9%AC%E5%87%8C&assignee=%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4&oq=%E9%A9%AC%E5%87%8C+%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4

这种方法可以加快锁的访问

【 在 yupluo 的大作中提到: 】

: 好像是阿里做kernel的专家, 提到x86 处理器cpu cache实现对lock性能有改进的地方。 当时没说具体细节。

: 是atomic instructions支持的不好吗?我的理解 x86下没有arm的LL/SC的方式,只有atomic指令:建议实现上采用near atomic,而不是far atomic的方式?

yupluo
yupluo 08月27日

多谢,学习了。

看概述专利的特点:

cpu1提交 transactional memory成功后,主动把cache给flush到LLC,方便下一个cpu来访问? 如果是这个思路,感觉普通atomic 指令完成write之后(spin_unlock()),然后cpu主动把自己的priviate cache给flush到LLC,这样是不是也有性能上提升?

但是假如push到LLC后,后面的cpu还是cpu1发起的访问,感觉这个优化就有点没必要了。是不是在典型的软件场景上,一般是其它cpu 。

我知道的有些处理器实现,对于mulit-core之间的next-level cache的allocation policy是exclusive until shared。 比如一个处理器cluster里面有per-cpu的 L1和L2 cache,还有cluster内部的L3 cache,外加bus上的system cache的层次结构。 除非软件采用了cache flush的操作指令,L3 cache和LLC只有在2个cpu或者以上访问这个数据的时候才缓存该cache line。 不过write的时候是exclusive的,会把其他cpu里面的cache line,包括L3 cache 和LLC 给invalidate掉。

transactional memory这一块实现不了解,这个专利需要好好阅读下。 假如一个transaction里面涉及到多个cacheline,按照你这个专利,是不是都要给clean & invalidate到LLC ?

【 在 MaLing 的大作中提到: 】

https://patents.google.com/patent/CN104951240B/zh?inventor=%E9%A9%AC%E5%87%8C&assignee=%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4&oq=%E9%A9%AC%E5%87%8C+%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4

: 这种方法可以加快锁的访问

MaLing
uranus 08月27日

"cpu1提交 transactional memory成功后,主动把cache给flush到LLC,方便下一个cpu来访问?"

Ling: 是

“如果是这个思路,感觉普通atomic 指令完成write之后(spin_unlock()),然后cpu主动把自己的priviate cache给flush到LLC,这样是不是也有性能上提升?”

Ling:是

“但是假如push到LLC后,后面的cpu还是cpu1发起的访问,感觉这个优化就有点没必要了。是不是在典型的软件场景上,一般是其它cpu 。”

Ling:这个CPU通过记住上次的更新是否来自相同的CPU1来操作,如果上次更新来自相同的CPU(cpu1)那么不用沉淀,如果不是那么推下去

“transactional memory这一块实现不了解,这个专利需要好好阅读下。 假如一个transaction里面涉及到多个cacheline,按照你这个专利,是不是都要给clean & invalidate到LLC ?”

Ling:是

【 在 yupluo 的大作中提到: 】

: 多谢,学习了。

:   看概述专利的特点:

:    cpu1提交 transactional memory成功后,主动把cache给flush到LLC,方便下一个cpu来访问? 如果是这个思路,感觉普通atomic 指令完成write之后(spin_unlock()),然后cpu主动把自己的priviate cache给flush到LLC,这样是不是也有性能上提升?

: ...................

BigCarrot
大萝卜1号 08月27日

Intel的 TSX 是不是不做了?

【 在 MaLing (uranus) 的大作中提到: 】

:    "cpu1提交 transactional memory成功后,主动把cache给flush到LLC,方便下一个cpu来访问?"

: Ling: 是

:  “如果是这个思路,感觉普通atomic 指令完成write之后(spin_unlock()),然后cpu主动把自己的priviate cache给flush到LLC,这样是不是也有性能上提升?”

: ...................

MaLing
uranus 08月27日

目前skylake还有,这个对于读写锁很好,尤其是读很频繁的场景。现有的读写锁即使只有读也会产生cache line ping-pong

【 在 BigCarrot 的大作中提到: 】

: Intel的 TSX 是不是不做了?

BigCarrot
大萝卜1号 08月28日

后面就没有了?

【 在 MaLing (uranus) 的大作中提到: 】

: 目前skylake还有,这个对于读写锁很好,尤其是读很频繁的场景。现有的读写锁即使只有读也会产生cache line ping-pong

MaLing
uranus 08月28日

据说要关掉。

【 在 BigCarrot 的大作中提到: 】

: 后面就没有了?

MaLing
uranus 08月28日

在锁方面的延迟很多还是来自于锁(cache line)的争抢产生的问题,这个专利是来解决这方面的问题。

专利:https://www.patentguru.com/cn/CN112307067A

虽然我们不断优化锁的性能,但是如果发现锁是性能的瓶颈,其实在告诉我们降低使用频率或者软件架构出现了问题,需要优化的是架构而不是锁,至少在芯片内部光传播技术普及之前无法解决RC delay,锁的本质属于物理问题。

【 在 yupluo 的大作中提到: 】

: 好像是阿里做kernel的专家, 提到x86 处理器cpu cache实现对lock性能有改进的地方。 当时没说具体细节。

: 是atomic instructions支持的不好吗?我的理解 x86下没有arm的LL/SC的方式,只有atomic指令:建议实现上采用near atomic,而不是far atomic的方式?

yupluo
yupluo 09月01日

还有点疑问:

把cacheline推到LLC,cpu访问的latency会更大。一般L1 cache hit的话只要几个cycle, L2 需要十几个,到bus上的LLC会更大。感觉更多是为了解决一个公平性的问题? 还有需要考虑到一个系统多cluster,每个cluster里面多cpu的情况。同cluster的多个cpu访问lock的话,push到L3 cache感觉更好点。不过貌似硬件没法知道改cache是cluster内部还是外部的cpu在用,因为write后都给invalidate掉了。

硬件实现上貌似bus protocol需要升级。对于普通的lock实现来讲,cpu1释放lock的时候,会invalidate掉其他cpu里面的cache,同时会唤醒其他cpu对该lock address进行访问。在这个专利的要求下, 从其他cpu发起的访问需要被hold住,不仅等cpu1的write完成,还需要等到其被push到LLC,而且在bus coherency logic里面要把存放该cpu 的状态给清掉。

transactional memory的情况,前面提到可能有多个cache line数据。根据其历史访问状态(记录在cache tag ram里面?)有的需要push到LLC,有的不需要。 比如transaction 1的block 对address A,B进行操作, transaction 2 block对A和C。 其他cpu在什么时候可以访问,感觉bus实现复杂了很多。

【 在 MaLing 的大作中提到: 】

: "cpu1提交 transactional memory成功后,主动把cache给flush到LLC,方便下一个cpu来访问?"

: Ling: 是

: ....................

tianbing1212
tianbing 09月01日

大赞,竟然是14年就申请了专利

那时候我还常常在版上喊 file a patent first,看来是多虑了

【 在 MaLing 的大作中提到: 】

https://patents.google.com/patent/CN104951240B/zh?inventor=%E9%A9%AC%E5%87%8C&assignee=%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4&oq=%E9%A9%AC%E5%87%8C+%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4

: 这种方法可以加快锁的访问

MaLing
uranus 09月01日

那时多谢版主的提醒

【 在 tianbing1212 的大作中提到: 】

: 大赞,竟然是14年就申请了专利

: 那时候我还常常在版上喊 file a patent first,看来是多虑了