代码之家  ›  专栏  ›  技术社区  ›  Den

最小化跨核心上下文切换的数量

  •  3
  • Den  · 技术社区  · 15 年前

    最近我尝试了很多应用程序评测(使用visualstudio性能向导)。在使用并发指示符时,我注意到这样一个事实:当应用程序使用多个线程(后台和前台)运行时,跨核上下文切换率非常高。

    我知道,通常大量的跨核心上下文切换会对应用程序性能造成不利影响,因此我希望将其降至最低限度。

    在.NET应用程序中,除了最小化同时运行的线程数之外,还有什么可能的方法可以做到这一点?

    2 回复  |  直到 15 年前
        1
  •  1
  •   LBushkin    15 年前

    您可以将其中一些线程关联到单个核心。但你必须这么做 be extremely careful when doing so

    为此,可以使用 BeginThreadAffinity 方法强制线程保持固定到特定处理器或内核的标识。

        2
  •  2
  •   mstone    12 年前

    实际上,跨核心上下文切换不太可能对应用程序性能造成不利影响。

    任何上下文切换都会产生约1-4微秒的直接成本来保存/恢复线程状态,再加上缓存预热的间接成本。间接成本取决于许多因素,如数据位置和访问模式,并且变化很大:从数百纳秒(几乎不增加总的上下文切换成本)到数百微秒(增加总成本两个数量级)。

    尽管可以合理地预计,对于跨核心上下文切换,缓存预热将花费更长的时间(如果新核心不与旧核心共享缓存),将线程调度到同一个核心仍然需要缓存预热,因为线程的部分或全部数据将被在该核心上执行的其他线程从缓存中逐出。

    只有在病态的情况下,即当一个线程使用完全适合非共享缓存的同一数据集长时间工作时,跨核上下文切换才会对性能产生明显的影响。大多数时候,它们不会成为瓶颈。

    作为旁注,与伊布什金的建议相反, BeginThreadAffinity 对处理器关联没有帮助:它只将.NET线程固定到特定的OS线程, 一个特定的核心。

    有用的链接:

    Using Concurrency for Scalability
    [2] Quantifying The Cost of Context Switch
    [3] How long does it take to make a context switch?

    推荐文章