Comparación de vectorización automática

Tengo problemas para que mi g ++ 5.4 use vectorización para comparar. Básicamente quiero comparar 4 entradas sin signo usando vectorización. Mi primer enfoque fue directo:

bool compare(unsigned int const pX[4]) {
    bool c1 = (temp[0] < 1);
    bool c2 = (temp[1] < 2);
    bool c3 = (temp[2] < 3);
    bool c4 = (temp[3] < 4); 
    return c1 && c2 && c3 && c4;
}

Compilando cong++ -std=c++11 -Wall -O3 -funroll-loops -march=native -mtune=native -ftree-vectorize -msse -msse2 -ffast-math -fopt-info-vec-missed se le dijo que no podía vectorizar la comparación debido a datos desalineados:

main.cpp:5:17: note: not vectorized: failed to find SLP opportunities in basic block.
main.cpp:5:17: note: misalign = 0 bytes of ref MEM[(const unsigned int *)&x]
main.cpp:5:17: note: misalign = 4 bytes of ref MEM[(const unsigned int *)&x + 4B]
main.cpp:5:17: note: misalign = 8 bytes of ref MEM[(const unsigned int *)&x + 8B]
main.cpp:5:17: note: misalign = 12 bytes of ref MEM[(const unsigned int *)&x + 12B]

Por lo tanto, mi segundo intento fue decirle a g ++ que alinee los datos y use una matriz temporal:

bool compare(unsigned int const pX[4] ) {
    unsigned int temp[4] __attribute__ ((aligned(16)));
    temp[0] = pX[0];
    temp[1] = pX[1];
    temp[2] = pX[2];
    temp[3] = pX[3];

    bool c1 = (temp[0] < 1);
    bool c2 = (temp[1] < 2);
    bool c3 = (temp[2] < 3);
    bool c4 = (temp[3] < 4); 
    return c1 && c2 && c3 && c4;
}

Sin embargo, la misma salida. AVX2 es compatible con mi CPU y la guía intrínseca de Intel me dice que hay, p._mm256_cmpgt_epi8/16/32/64 para comparacion. ¿Alguna idea de cómo decirle a g ++ que use esto?

Respuestas a la pregunta(1)

Su respuesta a la pregunta