我需要比较两个缓冲区chunk-wise为相等。我不需要关于两个缓冲区的关系的信息,就好像每两个区块相等或不相等。我的英特尔机最多支持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%。我能做得更好吗?
你在这个特定的代码中有瓶颈吗? – 2011-05-26 09:54:26
是的,这是我程序中的主要热点。 – beutelfuchs 2011-05-26 10:05:21
除非你的'memcmpy'实现被破坏,否则你将很难击败它 - 它应该已经被SIMD优化了。 – 2011-05-26 10:16:37