我正在尝试测量某些库调用的性能。我的主要测量工具是 rdtsc 调用。读了一些书后,我意识到我需要禁用抢占和中断才能获得最准确的读数。有人可以帮我弄清楚如何做这些吗?我知道 pthreads 有一个“set affinity”机制。这足以完成工作吗?
我还在某处读到我可以调用此类内核
preempt_disable()
raw_local_irq_save(...)
使用一种方法比使用另一种方法有什么好处吗?我尝试了后一种方法并得到了这个错误。
error: 'preempt_disable' was not declared in this scope
这可以通过包含 linux/preempt.h 来修复,但编译器仍然会报错。
linux/preempt.h: No such file or directory
很明显,我没有做过任何内核黑客攻击,而且我在我的系统上的任何地方都找不到这个文件。我真的希望我不必安装新的 Linux 内核。 :)
感谢您的输入。
最佳答案
可以使用 pthread_setaffinity_np
将 pthread
固定到单个 CPU 上
但是你最终想要达到的效果并不是那么简单。我会向您解释原因。
preempt.h
是 Linux 内核源代码的一部分。它位于 here .您需要随身携带内核源代码。无论如何,你需要编写一个内核模块来访问它,你不能从用户空间使用它。学习how to write a kernel module here .函数 preempt_disable
和其他 interrupt disabling kernel functions 的情况也是如此
现在的重点是,pthreads 在用户空间中,而你的抢占禁用功能在内核空间中。如何互动?
要么你需要write a new system call在你自己的地方你做你的抢占和中断禁用并从用户空间调用它。或者你需要求助于其他Kernel-User Space Interfaces像 procfs
, sysfs
, ioctl
等
但我真的很怀疑所有这些将如何帮助您对库函数进行基准测试。您可能想看看 how performance is typically measured using rdtsc
关于linux - 将 pthread 固定到单个核心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9932312/