gpt4 book ai didi

linux - 如何启动两个CPU核同时运行指令?

转载 作者:IT王子 更新时间:2023-10-29 00:59:42 24 4
gpt4 key购买 nike

例如,在X86中,2个CPU核心运行不同的软件线程。
此刻,这 2 个线程需要同时在它们的 CPU 核心上运行。
有没有一种方法可以同步这 2 个 CPU 内核/线程,或者类似的方法让它们在(几乎)同时(在指令级别)开始运行?

最佳答案

使用共享变量在两个线程之间传递基于 rdtsc 的截止日期。例如,设置截止日期为当前 rdtsc 值加上 10,000。

然后让两个线程在 rdtsc 上自旋,等待直到当前 rdtsc 值和阈值之间的差距小于阈值 T(T = 100 应该没问题)。最后,使用最终的间隙值(即截止日期rdtsc值减去最后读取的rdtsc值)跳转到一个依赖的add指令序列,使得add的数量指令等于间隙。

这最后一步补偿了每个芯片相对于它们的 rdtsc 自旋循环通常不会“同相”的事实。例如,假设 rdtsc 读数有 30 个周期的背靠背吞吐量,一个芯片可能会读取 890、920、950 等,而另一个可能会读取 880、910、940,因此会有如果单独使用 rdtsc,则会出现 10 或 20 个周期错误。使用添加滑动补偿,如果截止日期为 1,000,并且阈值为 100,则第一个线程将在 rdtsc == 920 处触发并执行 80 次加法,而第二个线程将在 处触发rdtsc == 910 并执行 90 次加法。原则上,两个核心然后大致同步。

一些注意事项:

  • 以上假定 CPU 频率等于标称 rdtsc 频率 - 如果不是这种情况,则在计算跳入位置时,您必须根据标称频率与真实频率的比率应用补偿因子添加幻灯片。
  • 不要指望您的 CPU 长时间保持同步:中断、高速缓存未命中等可变延迟操作或许多其他因素都可能导致它们不同步。
  • 您希望所有有效负载代码和附加幻灯片在每个核心的 icache 中都是热的,否则它们很可能会立即失去同步。您可以在同步之前通过此代码执行一次或多次虚拟运行来预热 icache。
  • 您希望 T 足够大以使间隙始终为正,因此比背靠背 rdtsc 延迟稍大,但不要大到增加添加幻灯片期间发生中断等事件的机会。
  • 您可以通过在同步后的“有效负载”代码中的不同点发出 rdtscrdtscp 来检查“同步”的有效性,并查看接近程度记录的值是跨线程的。

一个完全不同的选择是使用 Intel TSX:事务扩展。组织两个想要协调的线程,以读取事务区域内的共享行然后自旋,并让第三个线程写入共享行。这将导致两个等待线程都中止。根据内核间拓扑,两个等待线程可能会收到无效消息,因此随后的 TSX 几乎同时中止。从中止处理程序调用要“同步”运行的代码。

关于linux - 如何启动两个CPU核同时运行指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56931771/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com