SSE / SSE2がどのように機能するかについてもっと知りたい:SSE / SSE2は128ビット(16バイト)のサイズのmmxレジスタを使用し、通常これらのレジスタには4つのフロートセルがあり、パッキングによってフロートを格納できることを知っています。結果を得る前に、「それらを開梱」する必要があります。
私の質問は、私は初心者なので、なぜこれらの値をxmmレジスタにパックする必要があるのか、そしてなぜそれらをアンパックする必要があるのかということです。これの利点は何ですか?
それらをパック/アンパックする必要はありません。数値がすでに正しい形式になっている場合は、適切な移動命令を使用してそれらをレジスタにロードするか、メモリの内容を加算、減算などの第2オペランドとして使用するためのメモリオペランドを使用します。
時々起こることは、データが計算から必要な場所に行くための正しい場所に行き着かないということです、そしてこれは様々なパックとアンパックの指示が役に立つところです。
たとえば、これに対して3Dグラフィックスの計算を行っているとします。
struct coord { float X, Y, Z, W; };
ただし、計算を効率化するために、これらの構造体のうち4つを一度にロードし、4X
つすべてを1つのレジスタに、Y
4つすべてを別のレジスタにロードします。たとえば、すべて、、、および値を乗算しX
た後Y
、[一度に4つ]オブジェクトをスケーリング/回転するための変換行列を使用して、オブジェクトをX、Y、Z、およびWとして再度保存する必要があります。これは、適切な要素を対応する、、、、個別に「解凍」することによって行われます。エントリ。Z
W
X
Y
Z
W
もちろん、値の配列を使用する代わりに、、、および値coord
の4つの配列を格納した場合、値をパック/アンパックせずに、新しい値を配列内のそれぞれのスロットに格納できます。X
Y
Z
W
これらのレジスタはSSE命令への入出力であるためです。