La forma más rápida de calcular el valor absoluto utilizando SSE

Conozco 3 métodos, pero que yo sepa, solo se usan los primeros 2:

Enmascarar el bit de signo usandoandps oandnotps.

Pros: Una instrucción rápida si la máscara ya está en un registro, lo que la hace perfecta para hacer esto muchas veces en un bucle.Contras: la máscara puede no estar en un registro o peor, ni siquiera en un caché, lo que provoca una recuperación de memoria muy larga.

Reste el valor de cero a negar, y luego obtenga el máximo del original y negado.

Pros: Costo fijo porque no se necesita nada para buscar, como una máscara.Contras: siempre será más lento que el método de máscara si las condiciones son ideales, y tenemos que esperar a quesubps completar antes de usar elmaxps instrucción.

Similar a la opción 2, reste el valor original de cero para negar, pero luego "a nivel de bits" y el resultado con el original usandoandps. Realicé una prueba comparando esto con el método 2, y parece comportarse de manera idéntica al método 2, aparte de cuando se trata deNaNs, en cuyo caso el resultado será diferenteNaN que el resultado del método 2.

Pros: debe ser un poco más rápido que el método 2 porqueandps suele ser más rápido quemaxps.Contras: ¿Esto puede provocar un comportamiento no deseado cuandoNaNs están involucrados? Quizás no, porque unNaN sigue siendo unNaN, incluso si es un valor diferente deNaN, ¿derecho?

Pensamientos y opiniones son bienvenidos.

Respuestas a la pregunta(1)

Su respuesta a la pregunta