Ho la seguente funzione collo di bottiglia.Come ottimizzare 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;
}
}
voglio sostituire C++
codice con SSE2 funzioni intinsic. Ho provato _mm_cmpgt_epi8
ma ha usato il confronto firmato. Ho bisogno di confrontare senza firma.
C'è qualche trucco (SSE, SSE2, SSSE3) per risolvere il mio problema?
Nota: Non voglio usare multi-threading in questo caso.
Sapete quale architettura del processore avete scelto come target? Lavorando con un blocco di parole di 64 bit alla volta (il bit twiddling per rendere i confronti in-register) potrebbe ridurre un po 'il conflitto del bus di memoria. Il codice assembly del compilatore dovrebbe aiutare a fornire idee ... ... e SSE non è destinato a virgola mobile, non a operazioni integer? –
SSE ha alcune istruzioni intere. – Crashworks
Perché non li hanno fatti firmare? un semplice XOR 0x80 con ogni elemento prima del confronto farà il lavoro. – ruslik