我参考了这个网页: https ://software.intel.com/en-us/articles/benefit-power-and-performance-sleep-loops ,以下我看不懂:
暂停指令向处理器提示调用线程处于“自旋等待”循环中。此外,当在不支持英特尔 SSE2 的 x86 架构上使用时,暂停指令是无操作的,这意味着它仍然会在不执行任何操作或引发故障的情况下执行。虽然这意味着不支持英特尔 SSE2 的旧 x86 架构不会看到暂停带来的好处,但这也意味着您可以保留一个可以全面运行的简单代码路径。
我想知道,linux中的lscpu会显示cpu信息,但是我不知道我的cpu是否支持SSE2,我该如何自己检查?!
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
另外,目前我使用 _mm_pause 或 __asm volatile ("pause" ::: "memory"); 该内核中的 cpu 空闲将耗尽到零,但是使用 nanosleep 的以下代码对我来说太慢了:
while(1){
nanosleep();
dosomething..... ;
}
我观察到 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) ;
这个 nanosleep 在我上面哪个 cpu 的盒子里花费了 60 微秒,我不知道它是怎么发生的?!