Tengo la siguiente función de cuello de botella.¿Cómo optimizar un ciclo?
typedef unsigned char byte;
void CompareArrays(const byte * p1Start, const byte * p1End, const byte * p2, byte * p3)
{
const byte b1 = 128-30;
const byte b2 = 128+30;
for (const byte * p1 = p1Start; p1 != p1End; ++p1, ++p2, ++p3) {
*p3 = (*p1 < *p2) ? b1 : b2;
}
}
quiero reemplazar C++
código con SSE2 funciones intinsic. He intentado _mm_cmpgt_epi8
pero utilizó la comparación firmada. Necesito una comparación sin firma.
¿Hay algún truco (SSE, SSE2, SSSE3) para resolver mi problema?
Nota: No quiero usar multi-threading en este caso.
¿Sabe a qué arquitectura de procesador se dirige? Trabajar con un fragmento de palabra de 64 bits a la vez (un poco alborotado para hacer comparaciones en el registro) podría reducir algo la contención del bus de memoria. El código de ensamblado del compilador debería ayudar a proporcionar ideas ... ... ¿y no está destinado a SSE para operaciones de coma flotante, no enteros? –
SSE tiene algunas instrucciones enteras. – Crashworks
¿Por qué no los hizo firmados? un XOR simple 0x80 con cada elemento antes de la comparación hará el trabajo. – ruslik