在同一个 CPU 物理核心上同步是否更快?
Is synchronization faster on the same physical CPU core?
我有一个问题。如果一个线程修改了一个变量,同一个物理核心(不同的超线程核心)上的线程会比其他核心更早看到修改吗?或者它必须等到所有其他核心都看到它?
我一直在尝试将两个线程固定在同一个物理内核上,但性能却下降了。我知道这是因为两个核心共享大量资源。但是在同步方面。将线程放在同一个物理内核上会有帮助吗?
谢谢!
答案取决于平台(尤其是底层架构)。也就是说,在(主流)x86-64 架构上,共享同一内核的线程比不同内核甚至不同套接字上的线程通信速度更快。一个主要原因是这两个线程通常会共享同一个 L1 缓存(如果不是,则共享 L2 缓存)。因此,在线程上可以直接读取对方刚刚写的内容。此外,由于同步多线程(在 Intel CPU 上称为超线程)减少了通信延迟(无需等待调度量),线程通常可以 运行 并行。
同时,不同内核上的线程将不得不通过(慢速)总线进行通信或使用 L3 缓存共享数据(比 L1/L2 慢得多)。
然后你的工作负载受通信(延迟或吞吐量)的约束,通常最好将线程彼此靠近(即在同一个核心上)。当每个内核的线程数超过硬件线程数时,由于抢占式多任务处理,性能会下降。当工作负载受计算限制时,最好将它们放在不同的内核上。请注意,在现代 x86 处理器上,在同一内核上工作的线程甚至可以在指令级别共享计算资源 (ALU)。
我有一个问题。如果一个线程修改了一个变量,同一个物理核心(不同的超线程核心)上的线程会比其他核心更早看到修改吗?或者它必须等到所有其他核心都看到它?
我一直在尝试将两个线程固定在同一个物理内核上,但性能却下降了。我知道这是因为两个核心共享大量资源。但是在同步方面。将线程放在同一个物理内核上会有帮助吗?
谢谢!
答案取决于平台(尤其是底层架构)。也就是说,在(主流)x86-64 架构上,共享同一内核的线程比不同内核甚至不同套接字上的线程通信速度更快。一个主要原因是这两个线程通常会共享同一个 L1 缓存(如果不是,则共享 L2 缓存)。因此,在线程上可以直接读取对方刚刚写的内容。此外,由于同步多线程(在 Intel CPU 上称为超线程)减少了通信延迟(无需等待调度量),线程通常可以 运行 并行。 同时,不同内核上的线程将不得不通过(慢速)总线进行通信或使用 L3 缓存共享数据(比 L1/L2 慢得多)。
然后你的工作负载受通信(延迟或吞吐量)的约束,通常最好将线程彼此靠近(即在同一个核心上)。当每个内核的线程数超过硬件线程数时,由于抢占式多任务处理,性能会下降。当工作负载受计算限制时,最好将它们放在不同的内核上。请注意,在现代 x86 处理器上,在同一内核上工作的线程甚至可以在指令级别共享计算资源 (ALU)。