bar*_*hen 4 linux x86 sleep intel pause
我已参考此网页:https : //software.intel.com/zh-cn/articles/benefitting-power-and-performance-sleep-loops ,以下内容我无法理解:
暂停指令向处理器提示调用线程处于“旋转等待”循环中。此外,在不支持Intel SSE2的x86体系结构上使用时,pause指令是无操作的,这意味着它仍将执行而无需做任何事情或不会引起故障。虽然这意味着不支持Intel SSE2的较早的x86架构不会看到暂停带来的好处,但这也意味着您可以保持一条通向整个主板的简单代码路径。
我想知道,Linux中的lscpu会显示cpu信息,但是我不知道我是否支持SSE2的cpu,如何自己检查?
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 24
On-line CPU(s) list: 0-23
Thread(s) per core: 2
Core(s) per socket: 6
Socket(s): 2
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 63
Model name: Intel(R) Xeon(R) CPU E5-2643 v3 @ 3.40GHz
Stepping: 2
CPU MHz: 3599.882
BogoMIPS: 6804.22
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 20480K
NUMA node0 CPU(s): 0,2,4,6,8,10,12,14,16,18,20,22
NUMA node1 CPU(s): 1,3,5,7,9,11,13,15,17,19,21,23
Run Code Online (Sandbox Code Playgroud)
另外,当前我使用_mm_pause或__asm volatile(“ pause” :::“ memory”);cpu空闲将在该内核中耗尽为零,但是以下使用nanosleep的代码对我来说太慢了:
while(1){
nanosleep();
dosomething..... ;
}
Run Code Online (Sandbox Code Playgroud)
我观察到nanosleep将在我的盒子中延迟60微秒,有没有比nanosleep更快的解决方案,也不会耗尽_mm_pause()或__asm volatile(“ pause” :::“ memory”)这样的cpu核心?
编辑:
struct timespec req={0};
req.tv_sec=0;
req.tv_nsec=100 ;
nanosleep(&req,NULL) ;
Run Code Online (Sandbox Code Playgroud)
我在上面有哪个cpu的盒子中,这种纳秒睡眠花费了60微秒,我不知道它是怎么发生的?
检查您的平台是否支持SSE2
gcc -march=native -dM -E - </dev/null | grep SSE
Run Code Online (Sandbox Code Playgroud)
但是您无需检查支持:该pause指令在不能识别为的CPU上安全地解码为NOP pause。 (编码基本上是rep nop)。nop管道中的5个或100个周期的暂停(而不是5个或100个周期的暂停)不太可能是代码的正确性问题。
_mm_pause正如您提到的,它不会为调度程序释放CPU,它是为其他目的而设计的,例如,微体系结构组件的提示。
nanosleep,如果正确使用,应该比* 60us更好的控制(您可能需要将调度程序更改为RT)。我建议您检查代码以查看参数是否正确设置,等等。
- 编辑 -
纳米睡眠功能的准确性取决于内核。它的短暂睡眠行为只是glibc中的繁忙循环(请参阅参考资料)。由于调度程序仅在计时器触发时上下文切换,因此也无法让调度程序产生小于调度程序刻度(由CONFIG_HZ确定,通常为250、1000等)的时间间隔(例如,几纳秒)。
而且,仅使CPU空闲几纳秒实际上不会节省功耗。CPU功耗通过C状态或P状态保存。P状态使用频率缩放,而C状态关闭CPU组件。尽管有暂停指令可以执行这种状态转换,但是这样做需要花费时间(等待时间在我们的范围内),这使其变得昂贵。
参考:
http://tldp.org/HOWTO/IO-Port-Programming-4.html
http://ena-hpc.org/2014/pdf/paper_06.pdf