c – 如何跨核心同步TSC?
使用:
inline uint64_t rdtsc() { uint32_t cycles_high; uint32_t cycles_low; asm volatile ("CPUIDnt" "RDTSCnt" "mov %%edx,%0nt" "mov %%eax,%1nt": "=r" (cycles_high),"=r" (cycles_low):: "%rax","%rbx","%rcx","%rdx"); return ( ((uint64_t)cycles_high << 32) | cycles_low ); } 线程1正在运行 while(globalIndex < COUNT) { while(globalIndex %2 == 0 && globalIndex < COUNT) ; cycles[globalIndex][0] = rdtsc(); cycles[globalIndex][1] = cpuToBindTo; __sync_add_and_fetch(&globalIndex,1); } 线程2正在运行 while(globalIndex < COUNT) { while(globalIndex %2 == 1 && globalIndex < COUNT) ; cycles[globalIndex][0] = rdtsc(); cycles[globalIndex][1] = cpuToBindTo; __sync_add_and_fetch(&globalIndex,1); } 我看到了 CPU rdtsc() t1-t0 11 = 5023231563212740 990 03 = 5023231563213730 310 11 = 5023231563214040 990 03 = 5023231563215030 310 11 = 5023231563215340 990 03 = 5023231563216330 310 11 = 5023231563216640 990 03 = 5023231563217630 310 11 = 5023231563217940 990 03 = 5023231563218930 310 11 = 5023231563219240 990 03 = 5023231563220230 310 11 = 5023231563220540 990 03 = 5023231563221530 310 11 = 5023231563221840 990 03 = 5023231563222830 310 11 = 5023231563223140 990 03 = 5023231563224130 310 11 = 5023231563224440 990 03 = 5023231563225430 310 11 = 5023231563225740 990 03 = 5023231561739842 310 11 = 5023231561740152 990 03 = 5023231561741142 310 11 = 5023231561741452 12458 03 = 5023231561753910 458 11 = 5023231561754368 1154 03 = 5023231561755522 318 11 = 5023231561755840 982 03 = 5023231561756822 310 11 = 5023231561757132 990 03 = 5023231561758122 310 11 = 5023231561758432 990 03 = 5023231561759422 310 我不确定我是如何收到12458的乒乓球,但我想知道为什么我看到310-990-310而不是650-650-650.我认为tsc被认为是跨核心同步的.我的constant_tsc cpu标志已打开. 解决方法
你在运行这段代码的是什么? TSC同步应该在OS /内核中完成,并且取决于硬件.例如,您可以通过引导加载程序将powernow-k8.tscsync = 1之类的标志传递给内核引导参数.
您需要为OS和硬件的组合搜索正确的TSC同步方法.总的来说,这一切都是自动化的 – 如果您在自定义内核或非i686硬件上运行,我不会感到惊讶吗? 如果您使用正确的条款在Google上进行搜索,您会发现很多资源,例如有关此主题的邮件列表讨论.例如,这里是one algorithm being discussed(虽然显然它不是一个好的).然而,这并不是用户开发人员应该担心的事情 – 这是一个神秘的巫术,只有内核开发者需要担心他们的头脑. 基本上,在启动时,操作系统的工作是在一定的误差范围内同步SMP机器上所有不同处理器和/或内核之间的TSC计数器.如果您看到的数字非常严重,那么TSC同步就会出现问题,您可以更好地花时间查找操作系统未正确同步TSC而不是尝试实施自己的TSC同步算法的原因. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |