Я нашел следующий код SSE2, написанный для умножения матрицы 2x2. Может кто-нибудь объяснить мне, как этот код выполняется. Когда я просматриваю код, я чувствую, что он просто добавляет значения в две позиции матрицы C (2x2) (C [0], C [3]) «lda - это размер большой матрицы, а A, B и C - 2x2 матрица»Как читать следующий код SSE2
static void simd_2x2(int lda, double* A, double* B, double* C)
{
__m128d a,b1,b2,c1,c2;
c1 = _mm_loadu_pd(C+0*lda); //load unaligned block in C
c2 = _mm_loadu_pd(C+1*lda);
for(int i = 0; i < 2; ++i)
{
a = _mm_load_pd(A+i*lda);//load aligned i-th column of A
b1 = _mm_load1_pd(B+i+0*lda); //load i-th row of B
b2 = _mm_load1_pd(B+i+1*lda);
c1=_mm_add_pd(c1, _mm_mul_pd(a, b2)); //rank-1 update
c2=_mm_add_pd(c2, _mm_mul_pd(a, b2));
}
_mm_storeu_pd(C+0*lda, c1); //store unaligned block in C
_mm_storeu_pd(C+1*lda, c2);
}
A, B, C являются 2х2 блоками большой матрицы , Размер большой матрицы равен 2x2 – user3817989