1

给定(特别是)以下场景:

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

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

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

我还想知道线程安全机制在负载平衡与幼稚方法中可能会对性能产生什么影响。

4

2 回答 2

2

在我看来,在上述条件下,逐个任务类型的方法可能会带来更好的性能,因为该内核的本地缓存对于分配给它的特定任务会更有效率

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

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

我还想知道线程安全机制在负载平衡与幼稚方法中可能会对性能产生什么影响。

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

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

最后,重要的是要意识到,对于大多数线程程序,您将拥有比 CPU/内核更多的线程——尤其是考虑到经常有后台 GC、终结器和其他 VM 线程(假设您在 VM 上)竞争 CPU资源。这使得优化线程程序以利用线程与 CPU 的亲和性变得更加困难,这似乎暗示了您的问题。

于 2012-09-28T11:50:57.170 回答
0

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

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

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

于 2012-09-28T11:43:01.943 回答