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; } 那是微不足道的.现在,我该如何优化呢? 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中> 在SSE2指令集中: > 编辑:添加部分总和的更快方法: __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); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |