微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

比较缓冲区尽可能快

我需要比较两个缓冲块大小平等。 我不需要关于两个缓冲区的关系的信息,就是如果每两个区块相等或不相等。 我的英特尔机器支持SSE4.2

天真的做法是:

const size_t CHUNK_SIZE = 16; //128bit for SSE2 integer registers const int ARRAY_SIZE = 200000000; char* array_1 = (char*)_aligned_malloc(ARRAY_SIZE,16); char* array_2 = (char*)_aligned_malloc(ARRAY_SIZE,16); for (size_t i = 0; i < ARRAY_SIZE; ) { volatile bool result = memcmp(array_1+i,array_2+i,CHUNK_SIZE); i += CHUNK_SIZE; }

与我第一次尝试使用SSE相比:

union U { __m128i m; volatile int i[4]; } res; for (size_t i = 0; i < ARRAY_SIZE; ) { __m128i* pa1 = (__m128i*)(array_1+i); __m128i* pa2 = (__m128i*)(array_2+i); res.m = _mm_cmpeq_epi32(*pa1,*pa2); volatile bool result = ( (res.i[0]==0) || (res.i[1]==0) || (res.i[2]==0) || (res.i[3]==0) ); i += CHUNK_SIZE; }

速度增长约为33%。 我可以做得更好吗?

将源代码与反汇编代码进行匹配

“私人字节”不反映它。 如何find进程分配的确切内存?

系统调用位于glibc源文件

从jpeg内存缓冲区创buildHBITMAP?

gcc – / usr / bin / ld错误:无法在/ usr / local / lib中find<library>,但ldconfig列出它,path添加到ld.so.conf

我怎样才能模拟使用Win32挂钩的Alt + Tab?

什么是C / C ++数据段和堆栈大小?

如何找出我的代码的哪一部分是放缓我的c + +程序

epoll在断开客户端时循环

试图通过陷阱标记和陷阱信号处理程序单步执行程序,在vsyscall上崩溃

你真的不应该使用标量代码和联合来测试所有的单独的向量元素 – 做这样的事情,而不是:

for (size_t i = 0; i < ARRAY_SIZE; i += CHUNK_SIZE) { const __m128i a1 = _mm_load_si128(array_1 + i); const __m128i a2 = _mm_load_si128(array_2 + i); const __m128i vcmp = _mm_cmpeq_epi32(a1,a2); const int vmask = _mm_movemask_epi8(vcmp); const bool result = (vmask == 0xffff); // you probably want to break here if you get a mismatch ??? }

既然你可以使用SSE 4.1,还有另外一个可能更快的方法

for (size_t i = 0; i < ARRAY_SIZE; i += CHUNK_SIZE;) { __m128i* pa1 = (__m128i*)(array_1+i); __m128i* pa2 = (__m128i*)(array_2+i); __m128i temp = _mm_xor_si128(*pa1,*pa2); bool result = (bool)_mm_testz_si128(temp,temp); }

如果a & b != 0 , _mm_testz_si128(a,b)返回0 ,如果a & b == 0则返回1 。 优点是你可以在新的AVX指令中使用这个版本,其中块大小是32字节。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐