【发布时间】:2011-05-14 09:37:18
【问题描述】:
我想分别阻止一个线程在多个内核上执行,我不希望当某个线程在一个内核上执行时,它不应该被安排在另一个内核上执行。
我使用 x86 指令 RDTSC 来生成时间戳。当从不同的 CPU 内核调用该指令时,可能会使用不同的时间戳计数器,并且由于不同的计数器在 CPU 内核之间不同步,可能会出现不一致的结果。
在 Windows 上,有一个函数可以强制执行此行为:
DWORD_PTR WINAPI SetThreadAffinityMask(
__in HANDLE hThread,
__in DWORD_PTR dwThreadAffinityMask
);
为指定线程设置处理器关联掩码。
unix 系统有类似的东西吗?
【问题讨论】:
-
你知道
gettimeofday()在Linux 下会使用HPET,不是吗?这类似于 RDTSC,只是它独立于 CPU 频率,可靠,并且不需要篡改亲和掩码。 -
@Damon gettimeofday() 的分辨率对于分析指令来说太低了,不是吗?
-
分辨率为微秒,所以如果您打算只分析十几个独立的指令,是的。但是,如果你在一个真实的数据集上分析一段 realistic 代码(并且只有这样才真正有意义),那么它就完全足够了。知道 10 条汇编指令序列是在 30 还是 40 周期内运行并不能告诉您任何有价值的信息。重要的是代码在运行时的执行方式,例如半兆字节的真实数据,在一些周围的代码中流水线化,并具有分支预测和缓存效果。这些事情要重要 3 个数量级。
-
(顺便说一句,有趣的是,在这种情况下,精度优于分辨率,通常情况正好相反。但 HPET 实际上至少在更现代的系统上提供了数十纳秒的精度,只有
timeval不支持)
标签: linux multithreading unix scheduling