この Web ページを参照しました: https://software.intel.com/en-us/articles/benefitting-power-and-performance-sleep-loops 、以下は理解できません :
一時停止命令は、呼び出しスレッドが「スピン待機」ループにあるというヒントをプロセッサに提供します。さらに、一時停止命令は、Intel SSE2 をサポートしていない x86 アーキテクチャで使用された場合、ノーオペレーションです。つまり、何もせずに実行したり、エラーを発生させたりすることはありません。これは、Intel SSE2 をサポートしていない古い x86 アーキテクチャでは一時停止の利点が見られないことを意味しますが、ボード全体で機能する 1 つの単純なコード パスを維持できることも意味します。
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 マイクロ秒遅れるのを観察します。また、_mm_pause() や __asm volatile ("pause" ::: "memory") のような CPU コアを使い果たしないように、nanosleep よりも高速な解決策はありますか?!
編集 :
struct timespec req={0};
req.tv_sec=0;
req.tv_nsec=100 ;
nanosleep(&req,NULL) ;
この nanosleep は、私が持っているボックスで 60 マイクロ秒かかり、どの cpu が上にあるのですか?