【发布时间】:2019-11-17 18:47:20
【问题描述】:
例如,在 X86 中,2 个 CPU 内核运行不同的软件线程。
此刻,这 2 个线程需要同时在它们的 CPU 内核上运行。
有没有办法同步这 2 个 CPU 内核/线程,或者类似的方法让它们(几乎)同时开始运行(在指令级)?
【问题讨论】:
-
即使有可能,它们也会很快失去同步。
-
@tkausl:是的,下一个缓存未命中、中断或分支错误预测都会这样做。但是,如果您设法避免这种情况,并且 ROB / RS 的状态在两个内核上是相似的,那么它们可以在很长一段时间内以接近锁步的方式运行是合理的。 (当然这非常困难,尤其是避免中断,或者在没有缓存未命中或分支未命中的情况下做任何有用的事情。)
-
@PeterCordes
it's plausible that they could run in close to lock-step for a good while.取决于“good while”的定义。几千条指令?可能是。两秒?不太可能。他们需要被安排在同一时间进出,这不太可能发生。 (OP 没有提到任何关于实时系统的内容,所以我只是假设他们谈论的是常规的非实时系统) -
@tkausl:如果没有中断,调度程序将无法运行。 (禁用,或者只是在足够短的时间间隔内没有任何中断,或者在您已与中断隔离的内核上,除了定时器中断。)我的“好时机”是数百或数千个周期是合理的,而不是数十个数百万(对于 10 毫秒的时间片)!
-
使用变量来同步两个线程可能会导致一个人看到更新的值比第二个稍早(除非环形总线可以同时处理多个请求或线程在同一个核心中)。使用中断可能更精确(IPI、通常的 IRQ 或 TXT 唤醒),因为信号路径旨在到达多个目标(但如果它使用环形总线到达目标内核,不同的内核可能会有不同的延迟) .如果 TSC 同步,
umwait可以提供最佳结果。
标签: linux linux-kernel x86-64 thread-synchronization microbenchmark