C SIMD包含以下代码

C SIMD包含以下代码,c,x86,sse,simd,C,X86,Sse,Simd,如何在C中模拟以下代码(当然使用SIMD内部函数)?我在理解SIMD本质时遇到困难,这将有很大帮助: int sum_naive( int n, int *a ) { int sum = 0; for( int i = 0; i < n; i++ ) sum += a[i]; return sum; } int sum_naive(int n,int*a) { 整数和=0; 对于(int i=0;i

如何在C中模拟以下代码(当然使用SIMD内部函数)?我在理解SIMD本质时遇到困难,这将有很大帮助:

int sum_naive( int n, int *a )
{
    int sum = 0;
    for( int i = 0; i < n; i++ )
        sum += a[i];
    return sum;
}
int sum_naive(int n,int*a)
{
整数和=0;
对于(int i=0;i
下面是一个相当简单的实现(警告:未测试的代码):

int32\u t sum\u数组(常数int32\u t a[],常数int n)
{
__m128i vsum=_mm_set1_epi32(0);//初始化四个部分32位和的向量
国际贸易总额;
int i;
对于(i=0;i

请注意,输入数组,
a[]
需要16字节对齐,
n
应该是4的倍数。

您想到了哪种SIMD?SSE2?SSE可以使用以下内部函数。设置零位si128()、载荷si128(、p)和附加epi32(、a和b)(a0+b0、a1+b1、a2+b2、a3+b3)空位m128i存储空间si128(、a和b)确定。你尝试过什么?int sum_矢量化(int n,int*a){u m128i sum=\u mm_setzero_si128();\u mm_m128i a=\u mm_loadu_si128(\u m128i*p)for(int i=0;我将谈到堆栈溢出。你应该用你尝试过的东西来扩展这个问题,而不是评论。一些小事情。_mm_setzero_si128()更好的是,指令比RAM引用快,并且不是所有编译器都使用0参数优化远离集。此外,对于水平操作,我经常在探查器中看到,存储然后使用标量代码要快。@Soons:对于任何合理的n值,循环前后的代码都是非常不相关的。a+I不是比&a[I]快吗?@Gustavo6046:任何半体面的编译器都会为这两种指定相同内容的等效方法生成相同的代码。如果您有任何疑问,请尝试一下。
int32_t sum_array(const int32_t a[], const int n)
{
    __m128i vsum = _mm_set1_epi32(0);       // initialise vector of four partial 32 bit sums
    int32_t sum;
    int i;

    for (i = 0; i < n; i += 4)
    {
        __m128i v = _mm_load_si128(&a[i]);  // load vector of 4 x 32 bit values
        vsum = _mm_add_epi32(vsum, v);      // accumulate to 32 bit partial sum vector
    }
    // horizontal add of four 32 bit partial sums and return result
    vsum = _mm_add_epi32(vsum, _mm_srli_si128(vsum, 8));
    vsum = _mm_add_epi32(vsum, _mm_srli_si128(vsum, 4));
    sum = _mm_cvtsi128_si32(vsum);
    return sum;
}