g++ コンパイラを使用してロック フリー構造に取り組んでいます。-o1 スイッチを使用すると、g++ がコードの実行順序を変更するようです。コードの特定の部分で g++ の最適化を禁止し、他の部分の最適化を維持するにはどうすればよいですか? 2 つのファイルに分割してリンクできることはわかっていますが、見栄えがよくありません。
2 に答える
関数属性 "__attribute__ ((optimize 0))" を使用して、単一の関数の最適化を設定するか、コード ブロックの "#pragma GCC optimize" を使用できます。ただし、これらはGCC 4.4専用です。GCCのマニュアルを確認してください。サポートされていない場合は、ソースを分離するしかありません。
ただし、最適化をオンにしてコードが失敗した場合、特に根本的に非常に難しいことをしようとしている場合は、コードが間違っている可能性が最も高いと言えます。プロセッサはコードの並べ替えを実行する可能性があるため (順次の一貫性の制限内で)、GCC で得られる並べ替えはとにかく発生する可能性があります。
gcc がコードの実行順序を変更する場合は、メモリ バリアの使用を検討する必要があります。揮発性変数がその問題からあなたを守るとは思わないでください。それらは、単一のスレッドで動作が言語が保証するものであることを確認するだけであり、実行中のコードには「見えない」変更を説明するために常にメモリ位置から変数を読み取ります。(例えば、シグナルハンドラによって行われた変数への変更)。
GCC は、バージョン 4.2 以降の OpenMP をサポートしています。#pragma
これを使用して、特別なディレクティブでメモリ バリアを作成できます。
フリー コードのロックに関する非常に優れた洞察は、Herb Sutter と Andrei Alexandrescu によるこの PDF です: C++ and the Perils of Double-Checked Locking