多核处理器中的多线程应用程序

时间:2009-07-09 13:36:30

标签: multithreading multicore

这是一个有点普遍的问题。假设我在Java或VC ++中创建一个简单的应用程序,它创建了两个线程,我在多核系统中运行应用程序。如果没有任何特定的指令来运行哪个核心,那么应用程序本身是否会将线程分布在各个核心上?

感谢。

3 个答案:

答案 0 :(得分:8)

应用程序不会分发线程,但操作系统会分发。这是它的工作。 :)

值得注意的是,由于其他负载和中断可能会遇到cpu核心,线程可以在单个运行过程中频繁地在核心之间进行交换。

如果您决定需要指定特定线程可以运行的核心,操作系统通常会提供一种机制,将线程的“亲和力”设置为特定的cpu。这在高级优化方案中可能是有价值的,以使特定线程的高速缓存保持热,例如,但通常不需要它。

答案 1 :(得分:3)

操作系统将进程和线程分配给不同的核心。这并不是说你不能影响决定,一些操作系统可以让你控制决定这一点。根据需要,进程也可以在核心之间移动,以确保核心的良好利用。

答案 2 :(得分:1)

您可以在Windows上使用SetThreadIdealProcessor和相关的API调用执行此操作:

http://msdn.microsoft.com/en-us/library/ms684251(VS.85).aspx

如果您的线程都需要大量资源,那么您可能希望操作系统将它们分配到可用内核中。

我有点担心搞乱线程亲和性,因为你是第二次猜测操作系统的调度程序。例如,您可能会导致应用程序响应性降低,但调度线程的方式与应用程序的主UI线程竞争。

我通常在探查器和一些固定应用程序基准的帮助下按以下顺序处理事情,以便我可以比较不同的方法

  1. 算法
  2. 算法 - 说真的!在考虑其他任何事情之前先担心算法。
  3. 编译器开关 - 您是否为发布版本启用了所有优化。
  4. 编译器提示 - 确保您的代码尽可能多地为编译器提供信息,以便进行优化。例如,你是否过度使用指针或编译器无法猜测的其他机制。
  5. 缓存,线程亲和力等。
  6. 阿德