【问题标题】:SetThreadAffinityMask for unix systems用于 unix 系统的 SetThreadAffinityMask
【发布时间】:2011-05-14 09:37:18
【问题描述】:

我想分别阻止一个线程在多个内核上执行,我不希望当某个线程在一个内核上执行时,它不应该被安排在另一个内核上执行。

我使用 x86 指令 RDTSC 来生成时间戳。当从不同的 CPU 内核调用该指令时,可能会使用不同的时间戳计数器,并且由于不同的计数器在 CPU 内核之间不同步,可能会出现不一致的结果。

在 Windows 上,有一个函数可以强制执行此行为:

DWORD_PTR WINAPI SetThreadAffinityMask(
  __in  HANDLE hThread,
  __in  DWORD_PTR dwThreadAffinityMask
);

为指定线程设置处理器关联掩码。

MSDN link

unix 系统有类似的东西吗?

【问题讨论】:

  • 你知道gettimeofday() 在Linux 下会使用HPET,不是吗?这类似于 RDTSC,只是它独立于 CPU 频率,可靠,并且不需要篡改亲和掩码。
  • @Damon gettimeofday() 的分辨率对于分析指令来说太低了,不是吗?
  • 分辨率为微秒,所以如果您打算只分析十几个独立的指令,是的。但是,如果你在一个真实的数据集上分析一段 realistic 代码(并且只有这样才真正有意义),那么它就完全足够了。知道 10 条汇编指令序列是在 30 还是 40 周期内运行并不能告诉您任何有价值的信息。重要的是代码在运行时的执行方式,例如半兆字节的真实数据,在一些周围的代码中流水线化,并具有分支预测和缓存效果。这些事情要重要 3 个数量级。
  • (顺便说一句,有趣的是,在这种情况下,精度优于分辨率,通常情况正好相反。但 HPET 实际上至少在更现代的系统上提供了数十纳秒的精度,只有timeval 不支持)

标签: linux multithreading unix scheduling


【解决方案1】:

使用 Solaris,您可以使用 CPU 绑定,该绑定可以应用于单个线程、单个进程、一组进程或一个区域中的所有进程。请参阅processor_bindpbind

【讨论】:

    【解决方案2】:

    Linux 2.5.8 及更高版本具有sched_setaffinity()。它通常用于进程级别,但也适用于线程:

    亲和力掩码实际上是一个 每个线程的属性可以是 独立调整每个 线程组中的线程。价值 从对gettid(2) 的调用返回可以 在参数pid 中传递。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-24
      • 2011-06-13
      • 2023-04-09
      • 2011-05-29
      • 1970-01-01
      相关资源
      最近更新 更多