Il modo più veloce per calcolare il valore assoluto usando SSE

Sono a conoscenza di 3 metodi, ma per quanto ne so, solo i primi 2 sono generalmente utilizzati:

1) Maschera il bit del segno usando andps o andnotps .

  • Pro: un’istruzione veloce se la maschera è già in un registro, il che lo rende perfetto per farlo più volte in un ciclo.
  • Contro: La maschera potrebbe non essere in un registro o peggio, nemmeno in una cache, causando un recupero di memoria molto lungo.

2) Sottrai il valore da zero a negato, quindi ottieni il massimo dall’originale e negato.

  • Pro: costo fisso perché non serve nulla per il recupero, come una maschera.
  • Contro: sarà sempre più lento del metodo maschera se le condizioni sono ideali, e dobbiamo aspettare che i subps completati prima di usare l’istruzione maxps .

3) Simile all’opzione 2, sottrarre il valore originale da zero a negativo, ma poi “bit a bit” e il risultato con l’originale usando andps . Ho eseguito un test confrontandolo con il metodo 2, e sembra comportarsi in modo identico al metodo 2, a parte quando si tratta di NaN s, nel qual caso il risultato sarà un NaN diverso rispetto al risultato del metodo 2.

  • Pro: dovrebbe essere leggermente più veloce del metodo 2 perché andps è solitamente più veloce di maxps .
  • Contro: questo può comportare comportamenti non voluti quando sono coinvolti i NaN ? Forse no, perché un NaN è ancora un NaN , anche se è un valore diverso di NaN , giusto?

Pensieri e opinioni benvenuti.