2010-10-31 23 views
10

¿Qué deberíamos esperar del soporte de coma flotante en el compilador Delphi de 64 bits?Soporte de coma flotante en el compilador de 64 bits

  • utilizará compilador de 64 bits SSE a implementar la aritmética de punto flotante?

  • ¿El compilador de 64 bits admite flotante actual de 80 bits tipo (extendido)?

Estas preguntas están estrechamente relacionadas, por lo que las formulo como una sola pregunta.

+0

Sé que he leído sobre esto, pero realmente no recuerdo dónde. –

+0

posible duplicado de [¿Cómo debo preparar mis programas Delphi de 32 bits para un eventual compilador de 64 bits?] (Http://stackoverflow.com/questions/4051603/how-should-i-prepare-my-32-bit -delphi-programs-for-an-eventual-64-bit-compiler) –

+3

@gbrandt: ¿Entonces * cada * nueva pregunta concerniente a Delphi 64-bit debería cerrarse como un duplicado exacto? –

Respuesta

2

Para el doble = poco extendida:

de Lee Allen Bauer cuenta de Twitter Kylix_rd:

http://twitter.com/kylix_rd

En retrospectiva lógica, porque mientras reglas SSE2 son de 128 bits, que se utilizan como dos Dobles de 64 bits

+0

Pero es lo mismo que con otros tipos que no se ajustan a los registros: la convención de llamadas les permite pasar por referencia – PhiS

+0

Los enteros comúnmente tienen un tipo con mayor precisión que la ALU. (32 bits -> int64, 64 bits -> int128), esto tiene que ver con ciertas propiedades de los enteros. Sin embargo, este no suele ser el caso del punto flotante. La CPU x87 admite el nivel extendido como el más alto, pero Delphi no admite nada más. Mientras pasa por referencia (por ejemplo, como registro con dos dobles) funciona, eso solo resuelve el bombeo de datos. No hacer cálculos, que serán suaves y muy lentos. Tenga en cuenta que Int64 está parcialmente acelerado por la CPU –

3

De acuerdo con Marco van de Voort en su respuesta a: How should I prepare my 32-bit Delphi programs for an eventual 64-bit compiler:

x87 FPU está en desuso en x64, y en general, SSE2 se utilizarán para el punto florating. por lo tanto, el punto flotante y su manejo de excepciones podrían funcionar de forma ligeramente diferente, y extendido podría no ser de 80 bits (pero de 64 bits o, menos probable, de 128 bits). Esto también se relaciona con los cambios habituales de redondeo (control de coproducción) al interconectarse con el código C que espera una palabra fpu diferente.

PHIS ha comentado que la respuesta con:

Yo no diría que la FPU x87 está en desuso, pero es sin duda el caso de que Microsoft ha decidido hacer lo posible para que de esa manera (y realmente no parece que les gusten los valores de FP de 80 bits), aunque es claramente técnicamente posible usar los flotantes FPU/80-bit en Win64.

+0

FPU fue desaprobado por MS en x86_64 inicialmente (XP64), y afaik su contexto ni siquiera se guardó en las versiones iniciales de XP64. Esto fue remediado más tarde, pero aún está en desuso. –

+0

@Marco: tenga en cuenta que algunos compiladores (por ejemplo, el compilador de C++ de Intel) pueden producir código para la FPU x87 en x64. Además, el Macro Assembler de Microsoft para 64 bits admite el conjunto de instrucciones FPU. Por lo tanto, parece ser más un problema que Microsoft no desee el código x87 si pueden evitarlo (por ejemplo, VC++) pero el sistema operativo sí lo admite. – PhiS

+0

Es afaik obsoleto en la apéndice x86_64. Probablemente programado para ser retirado cuando los sistemas operativos de 32 bits (¿y las aplicaciones?) Son realmente geniales. –

3

Me acaba de publicar una respuesta a su otra pregunta, pero supongo que en realidad debería ir aquí:

Obviamente, nadie excepto para Embarcadero puede responder a ciencia cierta antes de distribuir el producto.

Es muy probable que cualquier compilador decente x64 use el conjunto de instrucciones SSE2 como línea de base y, por lo tanto, intente realizar el mayor cálculo de coma flotante utilizando las características SSE como sea posible, minimizando el uso de la FPU x87. Sin embargo, también se debe decir que no hay ninguna razón técnica que impida el uso de la FPU x87 en el código de la aplicación x64 (a pesar de los rumores en contrario que han existido por algún tiempo, si desea obtener más información sobre ese punto, por favor Eche un vistazo a Agner Fog's Calling Convention Manual, específicamente el capítulo 6.1 "¿Se pueden usar registros de punto flotante en Windows de 64 bits?").

Editar 1: Delphi XE2 Win64 de hecho no es compatible con los cálculos de 80 bits de coma flotante de la caja (ver por ejemplo discussuion here (aunque permite leer/escribir estos valores) Uno puede traer tales capacidades. volver a Delphi Win64 usando operadores de clase record +, como se hace en this TExtendedX87 type (aunque se aplican advertencias).

2

No sabremos con certeza cómo el compilador Delphi de 64 bits implementará la aritmética de coma flotante hasta que Embarcadero realmente lo envíe. Todo lo anterior es solo especulación. Pero una vez que sepamos con certeza, será demasiado tarde para hacer algo al respecto.

Los tweets de Allen Bauer parecen indicar que usarán SSE2 y que el tipo Extendido puede reducirse a 64 bits en lugar de 80 bits. Creo que sería una mala idea, por una variedad de razones. He escrito mis pensamientos en un informe de QualityCentral Extended should remain an 80-bit type on 64-bit platforms

Si no desea que su código pase de la precisión de 80 bits a la precisión de 64 bits cuando se mueve a Delphi de 64 bits, haga clic en el enlace QualityCentral y vota por mi informe. Cuantos más votos, más probabilidades tendrá Embarcadero de escuchar. Si usan SSE2 para el punto flotante de 64 bits, lo cual tiene sentido, agregar el punto flotante de 80 bits utilizando la FPU será un trabajo adicional para Embarcadero. Dudo que hagan ese trabajo a menos que muchos desarrolladores lo pidan.

+0

Gracias por el informe de control de calidad, muy apreciado. – PhiS

5

Hice dos publicaciones sobre el tema (here y there), para resumir, sí, el compilador de 64 bits usa SSE2 (precisión doble), pero no usa SSE (precisión simple). Todo se convierte en flotantes de doble precisión, y se calcula utilizando SSE2 (edit:, pero hay una opción para controlar eso)

Esto significa f.i. que si Maths en flotantes de doble precisión es rápido, las matemáticas con precisión simple son lentas (se generan muchas conversiones redundantes entre precisiones simples y dobles), "Extendido" se alias a "Doble" y la precisión de cálculos intermedios se limita a la precisión doble .

Editar: Hubo un indocumentado (en ese momento) directiva que controla la generación de código SSE, SSE {$EXCESSPRECISION OFF} activa la generación de código, lo que trae de vuelta el rendimiento dentro de las expectativas.

Cuestiones relacionadas