gpt4 book ai didi

c - 以下 SSE2 代码如何读取数据

转载 作者:太空宇宙 更新时间:2023-11-03 23:47:53 24 4
gpt4 key购买 nike

我发现以下 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 );
}

最佳答案

我猜你困惑的根源是 double 内在函数 (_mm_load_pd et al) 每个处理两个 double 值的 vector 。 lda 似乎是大步。例如:

        c1 = _mm_loadu_pd( C+0*lda );
c2 = _mm_loadu_pd( C+1*lda );

从 C、C+1、C+lda、C+lda+1 加载一个 2x2 的 double block 。

关于c - 以下 SSE2 代码如何读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28354085/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com