我通过查询寄存器在我的 C++ 程序中使用时间戳计数器。但是,我遇到的一个问题是获取时间戳的函数会从不同的 CPU 获取。如何确保我的函数始终从同一个 CPU 获取时间戳,或者无论如何要同步 CPU?顺便说一句,我的程序在 Fedora 13 64 位的 4 核服务器上运行。
谢谢。
查看英特尔手册的以下摘录。根据第 16.12 节,我认为下面的“较新的处理器”是指比 pentium 4 更新的任何处理器。如果支持,您可以使用 rdtscp 指令同时原子地确定 tsc 值和核心 ID。我还没有尝试过。祝你好运。
Intel 64 和 IA-32 架构软件开发人员手册
第 3 卷(3A 和 3B):系统编程指南:
第 16.12.1 章不变 TSC
较新处理器中的时间戳计数器可能支持增强,称为不变 TSC。处理器对不变 TSC 的支持由 CPUID.80000007H:EDX[8] 指示。
不变的 TSC 将在所有 ACPI P-、C- 中以恒定速率运行。和 T 状态。这是向前发展的架构行为。在具有不变 TSC 支持的处理器上,操作系统可以将 TSC 用于挂钟计时器服务(而不是 ACPI 或 HPET 计时器)。TSC 读取效率更高,并且不会产生与环转换或访问平台资源相关的开销。
英特尔还有一个代码执行基准测试指南,讨论了 cpu 与 rdtsc 的关联 - http://download.intel.com/embedded/software/IA/324264.pdf
根据我的经验,完全避免 TSC 是明智的,除非您真的想测量单个内核/CPU 上的单个时钟周期。
TSC 的潜在问题:
这基本上归结为,如果您强制线程关联,您只能使用 TSC 来测量单线程应用程序中单个 CPU 上经过的 CPU 周期(而不是经过的时间) 。
首选的替代方法是使用系统功能。最便携(在 Unix/Mac 上)是gettimeofday(),它通常非常准确。更合适的函数可能是clock_gettime(),但首先检查您的系统是否支持它。在 Windows 下,您可以安全地使用QueryPerformanceCounter()。
您可以使用sched_setaffinity
或 cpuset 功能,让您创建一个 cpuset 并将任务分配给集合。