Eşitlik için chunk-wise iki arabelleği karşılaştırmalıyım. İki arabelleğin her ikisi de eşitse veya olmasın, iki arabelleğin ilişkisi hakkında bilgiye ihtiyacım yok. Hiç SSE kullanarak benim ilk denemede için, arabellekleri olabildiğince hızlı bir şekilde karşılaştırır.
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;
}
karşılaştırıldığında: My istihbarat makinesi
naif bir yaklaşımdır SSE4.2 destekler hız
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;
}
kazanç yaklaşık 33% 'dir. Daha iyisini yapabilir miyim?
Bu kodda bir darboğaz var mı? –
Evet, programımın en önemli noktası. – beutelfuchs
'Memcmpy 'uygulamanız bozulmazsa, onu zorlamakta zorlanacaksınız - zaten SIMD tarafından optimize edilmiş olmalıdır. –