如何在OS X上设置处理器相似性?


17

您如何在MacBook Pro的Snow Leopard中设置处理器亲和力?我知道在Windows中您可以在“任务管理器”中进行切换。


2
<snarky-comment>在虚拟机中运行OS X,并设置虚拟机的亲和力</ snarky-comment>
zildjohn01 2010年

你为什么想做这个?除非您试图让运行旧程序的代码编写得如此糟糕,以至于在多核系统上无法运行,否则通常这是一个坏主意。
jalf

2
@jalf:处理器亲和力可以提高性能,因为在某些情况下它可以减少缓存无效化和垃圾回收。

1
真令人失望。看起来Mac永远不会成为实时软件开发的理想平台。
Evan Plaice

1
@jweyrich在具有QPI(Intel NUMA)的CPU(如Mac Pro)上除外,其中设置CPU关联会禁用内存关联并降低性能。但是,这不适用于移动处理器。
Jano 2012年

Answers:


14

自10.5版以来,OS X支持线程相似性API。这是我链接到的网页上的一些相关材料。

亲和力套装

相似性集是共享内存资源并希望共享L2缓存的线程的集合。不同的相似性集表示不同的相似性-也就是说,属于不同集的线程应使用单独的L2高速缓存,因此应在不同的逻辑处理器上运行。

亲和力集由“标签”标识。通过为线程指定特定的相似性集,将其分配给标识该相似性集的标签,即可将线程分配给该特定的相似性集。一个线程最多可以属于一个亲和力集合;也就是说,它具有一个亲和标签。

设置不同亲和力标签的效果

例如,想要在单独的L2缓存上运行2个线程的应用程序将为这些线程设置不同的相似性标签。在双核计算机上,这种亲和力将被有效忽略。但是,在4核MacPro上,调度程序将尝试在单独的程序包上运行线程。同样,在8核MacPro上,调度程序将尝试在单独的管芯上运行这些线程(它们可以或可以不在同一物理CPU包中)。

用法示例

想要在每个可用处理器上放置线程的应用程序将执行以下操作:

  • 使用sysctl(3)获取系统上的处理器数量。
  • 创建该数量的线程。
  • 为每个线程设置不同的相似性标签。
  • 启动所有线程。

具有默认相似性策略的线程将在任何处理器上更自由地进行调度。这些线程将优先迁移以在空闲处理器上运行。具有相似性标签的线程将倾向于保留在原处。

请查阅源代码中的代码清单,以及有关父子进程之间共享亲和力标签,获取CPU缓存配置等的信息。


除了此API之外,还有命令行实用程序吗?
Victor Eijkhout

11

http://developer.apple.com/mac/library/releasenotes/Performance/RN-AffinityAPI/

Mac OS X不导出用于标识处理器或控制线程位置的接口-不支持显式线程到处理器的绑定。相反,内核管理所有线程的放置。应用程序期望,在大多数情况下,调度程序将在缓存相似性方面使用良好的处理器位置来运行其线程。


2
自10.5版以来,OS X支持线程相似性API。有关详细信息,请参见我的答案。
void-pointer

4

到目前为止,XNU(1504.3.12)调度程序尚未实现对进程或线程的处理器亲和力。

因此,MacOSX没有提供任何手段来做到这一点。


2

来自http://images.apple.com/macosx/docs/OSX_for_UNIX_Users_TB_July2011.pdf

•高效的内核线程。每个POSIX线程都排队在特定的CPU上,从而提高了处理器的亲和力和可伸缩性,同时减少了锁争用。线程符合POSIX(1c),包括对取消和共享互斥的支持。

对我来说,这似乎是广告,我运行iMac的iMac大部分时间都在尊重这一点,但是并没有将进程“固定”到核心。

无论如何,我找不到任何API来控制与darwin的进程亲和力。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.