2010-02-10 12 views
27

estoy optimización de una función de clasificación para una biblioteca Numerics/estadística basada en la suposición de que, después de la filtración de cualquier NaNs y haciendo un poco haciendo girar poco, flota puede compararse como enteros de 32 bits sin cambiar el resultado y pueden ser dobles comparado con las entradas de 64 bits.¿Alguna CPU del mundo real no usa IEEE 754?

Esto parece acelerar la ordenación de estas matrices en algún lugar del orden del 40%, y mi suposición es válida siempre que la representación a nivel de bit de los números de punto flotante sea IEEE 754. ¿Hay CPU del mundo real que realmente uso (excluyendo en los dispositivos integrados, a los que esta biblioteca no apunta) que usan alguna otra representación que pueda romper esta suposición?

+0

muy interesante - se puede explicar de qué forma se les está comparando como enteros? – Saideira

Respuesta

17

Aparte de flawed Pentiums, cualquier CPU basada en x86 o x64 está utilizando IEEE 754 como su estándar aritmético de coma flotante.

Éstos son un breve resumen de las normas de FPA y sus adopciones.

IEEE 754:  Intel x86, and all RISC systems (IBM Power 
       and PowerPC, Compaq/DEC Alpha, HP PA-RISC, 
       Motorola 68xxx and 88xxx, SGI (MIPS) R-xxxx, 
       Sun SPARC, and others); 

VAX:   Compaq/DEC 

IBM S/390:  IBM (however, in 1998, IBM added an IEEE 754 
       option to S/390) 

Cray:   X-MP, Y-MP, C-90; other Cray models have been 
       based on Alpha and SPARC processors with 
       IEEE-754 arithmetic. 

A menos que su planificación en el apoyo a su biblioteca en arquitecturas de CPU bastante exóticos, es seguro asumir que por el momento el 99% de las CPU son compatibles con IEEE 754.

+14

Varía.Muchas implementaciones del mundo real de las arquitecturas en su lista son compatibles con IEEE754, pero con advertencias como no tener el conjunto completo de NaN, forzar denomers a cero, errores de ULP o dos en resultados de multiplicación/división, tener una multiplicación diferente por un ULP o dos dependiendo del orden del operando, etc. Por lo tanto, "el 99% de las CPU son compatibles con IEEE754" necesita una exención de responsabilidad: el espíritu es verdadero y, a los fines de la pregunta, es correcto, pero en general el demonio suele estar en los detalles. Más como, el 99% de las CPU son 99% compatibles con IEEE754. – moonshadow

+0

[Arquitecturas exóticas que preocupan a los comités de estándares] (http://stackoverflow.com/q/6971886/995714) –

4

del SPU differ in a few ways (como la falta de INF y NAN), pero no creo que hay diferencias romperían sus supuestos el procesador Cell ...

+3

Buen punto. La unidad SIMD de ARM-Neon (utilizada en el iPhone más nuevo y otros dispositivos móviles) también difiere en algunos aspectos. Sin embargo, la CPU puede ejecutar cálculos de flotación conformes en modo VPF. Ah, y el MIPS R5900 (PlayStation 2) también tenía algunos problemas. Lo más notable es que la última mantisa-bit de una multiplicación no estaba definida. –

+3

Actualmente tengo tres piezas separadas de hardware incrustado en mi escritorio en el trabajo con tres CPU distintas derivadas de PowerPC que no cumplen con las normas de tres maneras diferentes ... – moonshadow

10

Depende de dónde se traza la línea entre la "verdadera mundo "y el imaginario.

  1. El formato Vax G todavía es compatible con las máquinas Alpha (que HP dice que admitirán al menos hasta 2013).
  2. IBM hexadecimal FP sigue siendo apoyada por IBM unidades centrales de la serie z. Han agregado compatibilidad binaria y decimal IEEE, pero por lo que he oído, rara vez se usan, porque el FP hexadecimal es bastante más rápido (IBM lo ha estado optimizando durante unos 45 años ...)

hasta hace relativamente poco tiempo, todavía se vende por Unisys ClearPath IX sirve que admite el formato de Burroughs FP y máquinas ClearPath MCP para apoyar el formato Univac FP. Creo que ahora solo se ejecutan en emulación (en Xeons) pero, desde el punto de vista del software, es probable que continúen en uso activo durante otra década o más.

Incluso hay un few people que usa DtCyber para ejecutar Plato en los mainframes de Datos de control (emulados), con su formato único de coma flotante. (Lo siento, pero mi primera programación seria fue en una máquina Cyber ​​de CDC, así que no pude resistirme a mencionarla, incluso si no ha sido "el mundo real" durante décadas).

2

procesadores PowerPC (Mac hasta alrededor de 2006 a 2007, las toneladas de los actuales servidores IBM) utilizan un formato de 128 bits que consta de dos dobles para larga doble, en cambio si el formato extendido IEEE 754.

Sin embargo, en C u Objective-C, no hay forma portátil de interpretar un número flotante de 32 o 64 bits como un entero (suponiendo float y uint32_t, o double y uint64_t tienen el mismo número de bits). Cuando tenía que hacer ese tipo de cosas, tenía que escribir un código diferente según el compilador (uno usaba un sindicato, el otro era de doble * a largo *). No tengo idea de si una reinterpretación en C++ lo hará de forma portátil.

+0

es [aritmética doble-doble] (http://en.wikipedia.org/wiki/Quadruple-precision_floating-point_format # Double-double_arithmetic) –

+2

El "entorno numérico estándar de Apple" de Macintosh de los 80 usaba tipos de coma flotante de 32, 64 y 80 bits, siendo el de 80 bits el más rápido, ya que el exponente y la mantisa podría cargarse fácilmente en los registros sin enmascaramiento de bits, y aunque no sé si SANE aprovechó este hecho, la normalización diferida puede evitar lo que a veces puede ser una de las partes más lentas de la adición repetida de coma flotante. – supercat

Cuestiones relacionadas