Pregunta ¿Cómo funciona la instrucción BSWAP "acelerar la ejecución de la aritmética decimal"?


El Manual del desarrollador de software Intel Volumen 1, Sección 7.3.1.2 establece que la instrucción BSWAP "acelera la ejecución de la aritmética decimal". No explica cómo es esto, y Google tampoco está ayudando.

¿Alguien puede iluminarme en esto?


5
2017-10-31 21:21


origen


Respuestas:


Eso es un poco de un comentario desechable, ¿no?

La instrucción BSWAP (intercambio de bytes) invierte el orden de los bytes en un operando de registro de 32 bits. Las posiciones de bit 0 a 7 se intercambian con 24 a 31, y las posiciones de bit 8 a 15 se intercambian con 16 a 23. Ejecutar esta instrucción dos veces seguidas deja el registro con el mismo valor que antes. La instrucción BSWAP es útil para convertir formatos de datos "big-endian" y "little-endian". Esta instrucción también acelera la ejecución de la aritmética decimal. (La instrucción XCHG puede usarse para intercambiar los bytes en una palabra).

Y, además de eso, la última oración como paréntesis no tiene nada que ver con la afirmación a la que parece aplicarse. Y, si no es significado para hacerlo, ¿por qué tener los paréntesis en absoluto.

Mi La conclusión es que el doco todavía está siendo escrito por ingenieros de Intel en lugar de escritores de tecnología que habrían atrapado esos crímenes tortuosos contra el idioma inglés :-)


Pero, en cuanto a cómo podría acelerar las operaciones decimales, solo una posibilidad salta a la mente (y, sinceramente, fue más un avance doloroso que un salto).

Si tiene números grandes formados por dígitos decimales, uno por carácter, distribuidos secuencialmente en la memoria, puede haber una mejora en el rendimiento si puede manejarlos cuatro dígitos a la vez. Sin embargo, en una máquina little-endian, cargar los bytes (secuencial-en-memoria) {0x01, 0x02, 0x03, 0x04} como un valor de 32 bits (dword) le daría 0x04030201.

Haciendo un bswap en eso podría ser más fácil manipularlo como un dword, antes de hacer otro bswap antes de volver a escribirlo

Por supuesto, eso es especulación (aunque me gustaría considerarlo educado especulación (un)), pero Intel no nos da mucho para seguir en el documento al que se refiere. Buscando en los volúmenes 1, 2a, 2b, 2c, 3a, 3b y 3c para todas las apariciones de bswap tampoco parece aclararlo.


(un) Intel ha tenido algunas instrucciones "furtivas" para hacer cosas como esta durante años, la primera de las cuales puedo recordar fue la daa/das instrucciones para ajustar los valores BCD (dos por byte) después de usar la adición sin BCD basada en bytes. No está más allá de la posibilidad de pensar que pueden tener algo similar para los caracteres numéricos dentro de las palabras, aunque no he hecho una búsqueda exhaustiva.

Como primer paso, probablemente pueda examinar el IDFPL de Intel, su biblioteca que implementa el lado decimal del estándar IEEE754, puede encontrarlo allí. Si no, puede ser usado en otras bibliotecas decimales de alto rendimiento.


7
2017-10-31 21:43



Por lo general, la aritmética decimal se realiza en enteros de longitud variable o cadenas de puntos fijos de dígitos decimales empaquetados, y probablemente sea más conveniente almacenar estas cadenas en modo big-endian. Los datos se pueden cargar de 4 bytes a la vez en un registro, luego se usa BSWAP para intercambiar los datos. Sin embargo, como se mencionó, las instrucciones de ajuste decimal están orientadas por byte, por lo que si se usan estas instrucciones de ajuste decimal, los registros se podrían rotar 8 bits a la vez para realizar el cálculo orientado a bytes. BSWAP podría usarse en lugar de la primera rotación, pero no veo mucha ventaja aquí. No sé si hay algún truco inteligente para implementar un agregado decimal empaquetado de 32 bits, si lo hay, entonces BSWAP ayudaría.


2
2017-11-01 02:28