x86 では、mem が 32 ビットにアラインされている場合、mov 操作はアトミックであることが保証されます。
[mem] が 32 ビットにアラインされていない場合、問題なくlock inc [mem]
動作しますか?
正常に動作します。原子性を提供し、部分的な値を取得しません。
x86 では、mem が 32 ビットにアラインされている場合、mov 操作はアトミックであることが保証されます。
[mem] が 32 ビットにアラインされていない場合、問題なくlock inc [mem]
動作しますか?
正常に動作します。原子性を提供し、部分的な値を取得しません。
Intel Instruction Set Reference for x86 and x64 では、INC 命令のアライメント要件については何も言及されていません。それが言及しているのは次のLOCK
とおりです。
この命令を LOCK プレフィックスと共に使用して、命令をアトミックに実行できるようにすることができます。
LOCK
プレフィックスのドキュメントには次のように記載されています。
LOCK プレフィックスの整合性は、メモリ フィールドのアラインメントの影響を受けません。メモリのロックは、任意に位置合わせされていないフィールドに対して観察されます。
lock プレフィックスは、アラインされていないメモリ アクセスの原子性を提供します。QPI システムでは、これは非常に遅くなる可能性があります。インテルの Web サイトで次の投稿を参照してください。
メモリーアクセスの同時ミスアライメントのバグを解決する方法
http://software.intel.com/en-us/forums/showthread.php?t=75386
ハードウェアはアラインされていないアクセスで問題ないかもしれませんが、コードの実装はポインターの下位 2 または 3 ビットを盗むことに依存している可能性があります (それぞれ 32 または 64 ビットのアラインされたポインターでは常にゼロです)。
たとえば、(Win32) InterlockedPushSList 関数はポインターの下位 2 または 3 ビットを格納しないため、アラインされていないオブジェクトをプッシュまたはポップしようとしても、意図したとおりに機能しません。ロックフリー コードでは、余分な情報をポインタ サイズのオブジェクトに詰め込むのが一般的です。ただし、ほとんどの場合、これは問題ではありません。
Intel のプロセッサは常に優れたミスアライメント アクセス性能を発揮してきました。Nehalem (Core I7) では、完全にキャッシュ ライン内に位置合わせされていないアクセスにはペナルティがなく、キャッシュ ラインの境界を越える位置合わせされていないアクセスには平均 4.5 サイクルのペナルティがあり、非常に小さいです。