9

Intel の公式の最適化ガイドには、MMX コマンドから SSE への変換に関する章があり、次のステートメントが記載されています。

16 バイト境界にアラインされていない可能性のあるメモリ オペランドを使用する計算命令は、アラインされていない 128 ビット ロード (MOVDQU) に置き換えてから、代わりにレジスタ オペランドを使用する同じ計算操作を実行する必要があります。

(チャプター 5.8 64 ビットから 128 ビット SIMD 整数への変換、ページ 5-43)

「16 バイト境界にアラインされていない可能性がある」という意味が理解できません。明確にして、いくつかの例を挙げていただけますか?

4

3 に答える 3

16

複数のデータに対して同じ命令を実行する特定のSIMD命令では、このデータのメモリ アドレスが特定のバイト境界に揃えられている必要があります。これは事実上、データが存在するメモリのアドレスが、命令に必要なバイト数で割り切れる必要があることを意味します。

したがって、あなたの場合、アラインメントは 16 バイト (128 ビット) です。つまり、データのメモリ アドレスは 16 の倍数である必要があります。たとえば、0x00010 は 16 バイト アラインされますが、0x00011 はアラインされません。

データを整列させる方法は、使用しているプログラミング言語 (場合によってはコンパイラー) によって異なります。メモリアドレスの概念を持つほとんどの言語は、アラインメントを指定する手段も提供します。

于 2012-04-19T09:29:40.850 に答える
0

私はここで推測していますが、「16バイト境界に整列されていない可能性がある」ということは、このメモリ位置が以前に他の目的でより小さい値(4または8バイト)に整列されていて、現在実行されていることを意味する可能性がありますこのメモリの SSE 命令は、明示的にレジスタにロードする必要がありますか?

于 2012-04-19T12:40:26.093 に答える
-3

16 バイト境界に配置されたデータには、偶数 (厳密に言えば 2 の倍数) のメモリ アドレスがあります。各バイトは 8 ビットであるため、16 バイト境界に整列するには、2 バイトの各セットに整列する必要があります。

同様に、32 ビット (4 バイト) 境界に配置されたメモリのメモリ アドレスは 4 の倍数になります。これは、4 バイトをグループ化して 32 ビット ワードを形成するためです。

于 2012-04-19T08:48:07.060 に答える