Necesito comparar dos almacenamientos intermedios para la igualdad. No necesito información sobre la relación de los dos almacenamientos intermedios, solo si cada dos fragmentos son iguales o no. Mi máquina Intel soporta hasta SSE4.2comparar almacenamientos intermedios tan rápido como sea posible
El enfoque ingenuo es:
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;
}
comparación con mi primer intento usando SSE nunca:
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;
}
La ganancia de velocidad es aproximadamente un 33%. ¿Podría hacerlo mejor?
¿Tiene un cuello de botella en este código en particular? –
Sí, es el principal punto caliente en mi programa. – beutelfuchs
A menos que su implementación 'memcmpy' esté rota, tendrá dificultades para superarla, ya debería estar optimizada SIMD. –