【发布时间】:2015-04-05 21:44:01
【问题描述】:
我发现了以下 SSE2 代码,用于乘以 2x2 矩阵。谁能解释一下这段代码是如何执行的。当我浏览代码时,我觉得它只是将值添加到 C(2x2) 矩阵 (C[0],C[3]) 的两个位置。 lda是大矩阵的大小,A,B,C是2x2矩阵。
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 是一个大矩阵的 2x2 块。大矩阵的大小为 2x2
标签: c intrinsics sse2