我通过查询寄存器在我的C ++程序中使用时间戳计数器。但是,我遇到的一个问题是获取时间戳的功能将从不同的CPU获取。我怎样才能确保我的函数始终从同一个CPU获取时间戳,或者无论如何都要同步CPU?顺便说一句,我的程序运行在Fedora 13 64位的4核服务器上。
感谢。
答案 0 :(得分:4)
请查看以下英特尔手册的摘录。根据16.12节,我认为下面的“更新的处理器”指的是比奔腾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读取效率更高,不会产生开销 与环转换或访问平台资源相关联。
英特尔还有关于代码执行基准测试的指南,该指南讨论了与rdtsc的cpu关联 - http://download.intel.com/embedded/software/IA/324264.pdf
答案 1 :(得分:1)
根据我的经验,完全避免使用TSC是明智的,除非您真的想要测量单个内核/ CPU上的各个时钟周期。
TSC的潜在问题:
这基本上归结为只能在单线程应用程序中使用TSC来测量单个CPU上经过的CPU周期(未经过的时间),如果,则强制线程的亲和力
首选方案是使用系统功能。最便携(在Unix / Mac上)是gettimeofday(),通常非常准确。更合适的功能可能是clock_gettime(),但请先检查系统是否支持它。在Windows下,您可以安全地使用QueryPerformanceCounter()。
答案 2 :(得分:0)
您可以使用sched_setaffinity
或cpuset功能来创建cpuset并将任务分配给该组。