OK ...私は行の主要な行列の規則を使用します。 [m]
の各行には、8個の浮動小数点を得るために(2)__m128要素が必要です。 8x1ベクトルv
は列ベクトルです。 haddps
命令を使用しているので、SSE3が利用可能であると仮定します。 r = [m] * v
見つける:位置合わせ用として
void mul (__m128 r[2], const __m128 m[8][2], const __m128 v[2])
{
__m128 t0, t1, t2, t3, r0, r1, r2, r3;
t0 = _mm_mul_ps(m[0][0], v[0]);
t1 = _mm_mul_ps(m[1][0], v[0]);
t2 = _mm_mul_ps(m[2][0], v[0]);
t3 = _mm_mul_ps(m[3][0], v[0]);
t0 = _mm_hadd_ps(t0, t1);
t2 = _mm_hadd_ps(t2, t3);
r0 = _mm_hadd_ps(t0, t2);
t0 = _mm_mul_ps(m[0][1], v[1]);
t1 = _mm_mul_ps(m[1][1], v[1]);
t2 = _mm_mul_ps(m[2][1], v[1]);
t3 = _mm_mul_ps(m[3][1], v[1]);
t0 = _mm_hadd_ps(t0, t1);
t2 = _mm_hadd_ps(t2, t3);
r1 = _mm_hadd_ps(t0, t2);
t0 = _mm_mul_ps(m[4][0], v[0]);
t1 = _mm_mul_ps(m[5][0], v[0]);
t2 = _mm_mul_ps(m[6][0], v[0]);
t3 = _mm_mul_ps(m[7][0], v[0]);
t0 = _mm_hadd_ps(t0, t1);
t2 = _mm_hadd_ps(t2, t3);
r2 = _mm_hadd_ps(t0, t2);
t0 = _mm_mul_ps(m[4][1], v[1]);
t1 = _mm_mul_ps(m[5][1], v[1]);
t2 = _mm_mul_ps(m[6][1], v[1]);
t3 = _mm_mul_ps(m[7][1], v[1]);
t0 = _mm_hadd_ps(t0, t1);
t2 = _mm_hadd_ps(t2, t3);
r3 = _mm_hadd_ps(t0, t2);
r[0] = _mm_add_ps(r0, r1);
r[1] = _mm_add_ps(r2, r3);
}
を、型__m128の変数は自動的にスタック上に整列されるべきです。ダイナミックメモリでは、これは安全な前提ではありません。一部のmalloc /新しい実装では、8バイト境界になるように保証されたメモリしか返されません。
intrinsicsヘッダーは_mm_mallocと_mm_freeを提供します。この場合、alignパラメータは(16)でなければなりません。
どのような結果が期待されますか?私は行列を見ません、ベクトル乗算だけです。また、3、8、4はどこから来たのですか? – pezcode
@ user963889では、寸法が意味をなさない。あなたは何をしようとしているのですか? 8x1ベクトルまたはベクトルの配列に8x8行列を掛けますか? –
@BrettHaleベクトル8x1の8x8の倍数を仮定します。私は結果として8x1を取得したい。ハマった。あなたは私を正しい方向に導くことができますか?ありがとう。 – user1012451