【问题标题】:Scheduling a single thread across different processors - need to clear cache?跨不同处理器调度单个线程 - 需要清除缓存?
【发布时间】:2012-12-07 19:22:07
【问题描述】:

当您跨不同处理器调度单个线程时,是否每次都必须清除缓存?如果不清除缓存,会不会出现以下情况:

假设您有以下(伪)代码由 2 个处理器 P1 和 P2 执行。

     1. foo() {
     2. int x=5;
     3. x=10;
     4. print x;
     5. }

最初线程被调度在 P1 上,它执行第 1 行和第 2 行,并将 5 存储在其缓存中作为 x 的内存位置(在堆栈上)。

线程随后被调度到执行第 3 行的 P2 上,并将 10 存储在 缓存中以用于 x 的内存位置。

最后,线程再次被调度在 P1 上,并执行第 4 行,打印 5(x 在 P1 的缓存中的值)。

但我们显然希望打印 10 个。

【问题讨论】:

    标签: multithreading caching scheduling processor


    【解决方案1】:

    是的,处理器缓存/寄存器需要更新,或者至少刷新到主内存,因此如果线程迁移到另一个内核/处理器,它可以获取其最近的内存。

    幸运的是,我们通常为其编写代码的常见服务器/桌面平台是cache coherent,因此硬件负责所有的魔法以使这项工作正常进行,并且操作系统无论如何都需要确保为只要操作系统决定运行该线程,就可以使用线程/进程。这不是应用程序代码需要担心的任务。

    如果您使用的平台不是缓存一致的,您可能会知道 - 如果操作系统决定迁移,您使用的操作系统/线程库很可能会确保正确更新缓存一个线程到另一个处理器。

    【讨论】:

      猜你喜欢
      • 2014-07-04
      • 2013-04-13
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      • 2015-11-15
      • 2016-10-14
      • 1970-01-01
      • 2013-01-08
      相关资源
      最近更新 更多