Pesquisa rápida de alguns petiscos em duas polegadas no mesmo deslocamento (C, microoptimização)

Minha tarefa é verificar (> trilhões de verificações), dois int contêm qualquer par predefinido de petiscos (primeiro par 0x2 0x7; segundo 0xd 0x8). Por exemplo:

bit offset:   12345678
first int:  0x3d542783     first pair of  0x2    second:   0xd   
second int: 0x486378d9      nibbles:      0x7      pair:   0x8
               ^  ^

Portanto, neste exemplo, marquei duas compensações com os pares necessários (as compensações são 2 e 5; mas não um 7). Compensações reais e número de pares encontrados não são necessários na minha tarefa.

Portanto, para duas entradas dadas, a questão é:Eles contêm qualquer um desses pares de petiscos no mesmo deslocamento.

Eu verifiquei meu programa, essa parte é o lugar mais quente (gprof comprovada); e é chamado de muito, muito, muitas vezes (gcov comprovada). Na verdade, é o terceiro ou o quarto loop (mais aninhado) dos loops aninhados.

Meu código atual é lento (eu o reescrevo como função, mas é um código do loop 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
}

A outra tarefa é encontrar esses pares não apenas nas compensações de 0,4,8 bits e assim por diante, mas nas compensações de 0,2,4,8,10, ... bits:

#define douburu_nibble_check(A,B) (nibble_check(A,B) || nibble_check(A>>2, B>>2) )

É possível reescrever essa função e macro de maneira paralela?

Meu compilador é o gcc452 e a CPU é o Intel Core2 Solo no modo de 32 bits (x86).

questionAnswers(6)

yourAnswerToTheQuestion