0

ハードウェア トランザクション メモリを使用するシナリオでは、システムまたは IO 呼び出しを発行しないスリープが必要です (これらの呼び出しは中止につながります)。のように 1 マイクロ秒スリープするusleep(1)だけで十分です。

This questionは、ネストされたループを実装して、プログラムをビジー状態に保ち、しばらく遅らせることを提案しています。ただし、これらのループを削除する最適化を使用してコンパイルできるようにしたいと考えています。

アイデアは、洗練された数学の方程式を計算することです。これに対するアプローチはありますか?実際の待機時間は正確である必要はありません。ただし、複数の実行で漠然と同じである必要があります。

4

3 に答える 3

1

volatileディレクティブでnopループを試してください:asm

for (int i = 0; i < 1000; i++) { 
    asm volatile ("nop"); 
} 

揮発性は、オプティマイザーがそれを取り除くのを防ぐ必要があります。それでもうまくいかない場合は、 を試してください__volatile__

于 2014-03-18T14:03:38.083 に答える
0

ここで難しいのはタイミングです。OSによっては、あらゆる種類のタイマーのクエリがI / O関数としてカウントされる場合があります。

しかし、遅延ループだけが必要な場合で、タイミングがそれほど重要でない場合は、プラットフォーム固有のコードを検討する必要があります。たとえば_mm_pause、CPU 命令に変換される Intel 固有の組み込み呼び出しがpauseあり、これは基本的に、次のメモリ バス同期が行われるまでパイプラインを停止します。スピンロックループに入れるように設計されています(新しい情報の可能性があるまで、アトミック変数をスピンして再クエリしても意味がありません)が、コンパイラが遅延ループを空として削除するのを妨げる可能性があります(ドキュメントを読む .

于 2014-03-18T11:17:44.587 に答える