加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 是否有加速校验和计算的SIMD指令?

发布时间:2020-12-16 06:56:57 所属栏目:百科 来源:网络整理
导读:我将不得不编写一个非常基本的校验和函数,例如: char sum(const char * data,const int len){ char sum(0); for (const char * end=data+len ; dataend ; ++data) sum += *data; return sum;} 那是微不足道的.现在,我该如何优化呢? 首先,我应该使用一些std
我将不得不编写一个非常基本的校验和函数,例如:

char sum(const char * data,const int len)
{
    char sum(0);
    for (const char * end=data+len ; data<end ; ++data)
        sum += *data;
    return sum;
}

那是微不足道的.现在,我该如何优化呢?
首先,我应该使用一些std :: for_each与lambda或类似的东西:

char sum2(const char * data,const int len)
{
    char sum(0);
    std::for_each(data,data+len,[&sum](char b){sum+=b;});
    return sum;
}

接下来,我可以使用多个线程/核心来总结块,然后添加结果.我不会把它写下来,我担心创建线程的成本(或者从池中获取它们),然后切断阵列,然后调度所有内容等等,考虑到我大部分时间都不会很好计算小数组的校验和,大多数为10-100字节,很少高达1000.

但我真正想要的是更低级别的东西,一些SIMD东西可以在128b寄存器上总结字节,或者可能在两个寄存器之间独立地求和字节而不携带进位,或两者兼而有之.

那里有什么东西吗?

注意:这是实际的过早优化,但它很有趣,所以到底是什么?

编辑:我仍然需要一种方法来总结SSE寄存器中的所有字节,比这更好

char ptr[16];
_mm_storeu_si128((__m128i*)ptr,sum);
checksum += ptr[0] + ptr[1] + ptr[2]  + ptr[3]  + ptr[4]  + ptr[5]  + ptr[6]  + ptr[7]
          + ptr[8] + ptr[9] + ptr[10] + ptr[11] + ptr[12] + ptr[13] + ptr[14] + ptr[15];

解决方法

是的,MMX指令集中有这样的指令,称为“Packed ADD”:

在Visual C中> _mm_add_pi8
> gcc中的__builtin_ia32_paddb

在SSE2指令集中:

> _mm_add_epi8在Visual C中
> gcc中的__builtin_ia32_paddb128

编辑:添加部分总和的更快方法:

__m128i sums;

sums = _mm_add_epi8(sums,_mm_srli_si128(sums,1));
sums = _mm_add_epi8(sums,2));
sums = _mm_add_epi8(sums,4));
sums = _mm_add_epi8(sums,8));
checksum += _mm_cvtsi128_si32(sums);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读