6

この 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 が上にあるのですか?

4

2 に答える 2

8

プラットフォームが SSE2 をサポートしているかどうかを確認するには

gcc -march=native -dM -E - </dev/null | grep SSE

ただし、サポートを確認する必要はありませんpause命令は、それを として認識しない CPU では NOP として安全にデコードされpauseます。 (エンコーディングは基本的にrep nopです)。nopパイプラインでの 5 サイクルまたは 100 サイクルの休止ではなく、コードの正確性の問題になる可能性はほとんどありません。


_mm_pauseマイクロアーキテクチャコンポーネントのヒントなど、別の目的のために設計されていると述べたように、scheduler の CPU を解放しません。

nanosleep を正しく使用すると、*60us よりも細かい制御が可能になります (スケジューラを RT に変更する必要がある場合があります)。コードをチェックして、引数が正しく設定されているかどうかなどを確認することをお勧めします。

- 編集 -

nanosleep 関数の精度はカーネルに依存します。そして、短いスリープの動作は、glibc のビジー ループ (リファレンスを参照) です。また、タイマーが起動したときにスケジューラーのみがコンテキストを切り替えるため、スケジューラーのティック (通常は 250、1000 などである CONFIG_HZ によって決定される) よりも短い間隔 (たとえば、数ナノ秒) の間、スケジューラーに譲ることもできません。

また、CPU を数ナノ秒間アイドル状態にするだけでは、実際には電力を節約できません。CPU の電力は、C-State または P-State によって節約されます。P-State は周波数スケーリングを使用し、C-State は CPU のコンポーネントをシャットダウンします。このような状態遷移を行う停止命令はありますが、遷移に時間がかかるため (μs の範囲のレイテンシー)、コストが高くなります。

参照:

http://tldp.org/HOWTO/IO-Port-Programming-4.html

http://ena-hpc.org/2014/pdf/paper_06.pdf

于 2016-05-06T06:00:11.397 に答える