私は、2 つの行列 4x4 を受け取り、組み込み関数を使用してそれらを乗算するプログラムを実行しています。私が今まで理解していること:
- MMX/SSE 命令セットにより、コンピューティングを高速化できます。特に、4 バイトの要素ベクトルを使用します。
__m128
16 バイトのベクトル (4 バイトの 4 つの要素) を表します。さらに、機能するためには__m128
データを整列させる必要があります。
私が迷子になる場所はここにあります:
_mm_mul_ps(_m128, _m128)
(私が読んだように)4バイトの4つのflotatの16バイトの2つのベクトルを取る関数。2 つのベクトルを「1 対 1」で乗算し、 を返します_m128
。しかし、その_m128
ベクトルには正確に何が含まれていますか (何の結果)?- 関数
_mm_hadd_ps(_m128, _m128)
は、2 つの 16 バイトのベクトル (それぞれ 4 バイトの float) を追加します。このように「水平に追加」します。
vectorA(a1, a2, a3,a4) + vectorB(b1, b2, b3, b4) = vectorResult(a1 + a2, a3 + a4, b1 + b2, b3 + b4)
私がやろうとしていること:
// Stores the result of multiply on row of A by one column of B
_declspec (align(16)) __m128 aux;
// Horizontal add
for(int i = 0; i < 4; i++){
for (int j = 0; j < 4; j++){
aux= _mm_mul_ps(vectorA[i], vectorB[j]);
// Add results
aux = _mm_hadd_ps(aux, aux);
aux = _mm_hadd_ps(aux,aux);
}
}
機能がどのように機能するかわかりません (「心的イメージ」がありません)。