每核心缓存&线程池

时间:2012-09-28 11:22:08

标签: multithreading performance threadpool cpu-cache

鉴于(特别)以下情况:

  • 每个核心一个帖子,
  • 每个核心都有自己独特的缓存,
  • 高速缓存命中/未命中率对于良好性能(即今天大多数)至关重要的程序

我经常阅读线程池在多核系统中调度工作的好处。尽管有多种多线程方法,但通常在这种更智能的负载平衡方法与更天真的“按任务类型分配线程”方法之间进行比较,其中假设负载平衡已在开发时间,而不是系统本身在运行时。这方面的一个例子可能是在一个线程上进行专用数字运算,在另一个线程上进行渲染任务。

在我看来,在上述条件下,逐个任务类型的方法可以带来更好的性能,因为该核心的本地缓存对于它所具有的特定任务来说会更高效被分配? (假设等待不是问题,即两个线程都在全速运行或接近全速运行。)

我也想知道在负载均衡与天真的方法中,线程安全机制可能会对性能产生什么影响。

2 个答案:

答案 0 :(得分:2)

  

在我看来,在上述条件下,逐个任务类型的方法可以带来更好的性能,因为核心的本地缓存对于它所具有的特定任务来说会更有效率。已被分配

线程编程带来的最大性能提升关于分叉的任务类型,而是异步其操作的方式。如果任务与共享资源密切相关,这意味着它必须经常锁定和同步内存,那么您将无法在单独的处理器上获得缓存内存的好处。

编辑:我现在看看你要去哪儿尼克。根据定义,负载平衡系统 ,从一些常见的任务队列消耗,因此可能有更多的同步点。但是,不同的任务可能是处理数据库或写入文件系统,并阻止阻碍其异步运行的其他资源。即使负载平衡方法可能需要更多同步,它也是显着提高应用程序吞吐量的最简单方法。

  

我也想知道在负载均衡与天真的方法中,线程安全机制可能会对性能产生什么影响。

右。这是关键点。线程安全意味着同步或其他锁定以及将脏内存写入中央存储,并使其他线程更新的高速缓存内存无效。线程任务执行此类操作的次数越多,其性能就越差。

同样,这不一定是关于任务的类型,负载平衡与任务类型,而是关于执行任务所需的代码的具体细节。

最后,重要的是要意识到对于大多数线程程序,您将拥有比CPU /核心更多的线程 - 特别是考虑到通常有后台GC,终结器和其他VM线程(假设您在VM上)争夺CPU资源。这使得优化线程程序以利用线程到CPU的亲和力变得更加困难,这似乎暗示在你的问题中。

答案 1 :(得分:0)

  在我看来,在上述条件下,   逐个任务类型的方法可以带来更好的性能[...]

似乎你在这里比较苹果和橘子。显然,如果您有多个不同的任务是独立的并且具有不同的执行模式,那么每个此类任务类型启动一个线程是最好的方法。线程池不适合这种工作,它们用于相同的任务,不关心哪个线程执行它们,这是它们最大的优势。

现在,您必须区分应用程序级别的线程池和OS级别的线程池。在应用程序级别,您希望线程匿名执行任务以确保负载平衡。这是完全可取的。但是在操作系统级别,线程被映射到核心,但是OS通常会在执行期间将它们保留在初始核心上,即核心负载平衡不像应用程序负载平衡那样具有攻击性,具体是由于缓存问题。