Búsqueda rápida de algunos mordiscos en dos entradas en el mismo desplazamiento (C, microoptimización)
Mi tarea es verificar (> billones de comprobaciones), ¿dos int contienen alguno de los pares predefinidos de nibbles (primer par 0x2 0x7; segundo 0xd 0x8). Por ejemplo
bit offset: 12345678
first int: 0x3d542783 first pair of 0x2 second: 0xd
second int: 0x486378d9 nibbles: 0x7 pair: 0x8
^ ^
Entonces, para este ejemplo, marco dos desplazamientos con los pares necesarios (los desplazamientos son 2 y 5; pero no un 7). Las compensaciones reales y el número de pares encontrados no son necesarios en mi tarea.
Entonces, para dos entradas dadas la pregunta es:Does contiene cualquiera de estos pares de mordiscos en el mismo desplazamiento.
Revisé mi programa, esta parte es el lugar más popular gprof
probado); y se llama muchísimas veces gcov
probado). En realidad, es el tercer o cuarto bucle (más anidado) de bucles anidados.
Mi código actual es lento (lo reescribo como función, pero es un código del bucle interno):
static inline int nibble_check (uint32_t A, uint32_t B)
__attribute__((always_inline))
{
int i;
for(i=0;i<8;i++)
if( ( ( (A&0xf) ==0xD) && ( (B&0xf) ==0x8) ) // first pair
|| ( ( (A&0xf) ==0x2) && ( (B&0xf) ==0x7) ) ) // second pair
return 1; // nibbles found
else {
A>>=4;
B>>=4;
}
return 0; // nibbles not found
}
La otra tarea es encontrar estos pares no solo en las compensaciones de 0,4,8 bits, etc., sino también en las compensaciones de 0,2,4,8,10, ... bits:
#define douburu_nibble_check(A,B) (nibble_check(A,B) || nibble_check(A>>2, B>>2) )
Es posible reescribir esta función y macro en forma paralela?
Mi compilador es gcc452 y cpu es Intel Core2 Solo en modo de 32 bits (x86).