2012-03-14 12 views
7

Estoy leyendo el código para las rutinas de optimización (Nelder Mead, SQP ...). Los idiomas son C++, Python. Observo que a menudo se realiza la conversión de doble a flotante, o los métodos se duplican con doble resp. argumentos flotantes ¿Por qué es rentable en el código de rutinas de optimización, y es significativo? En mi propio código en C++, ¿debería tener cuidado con los tipos double y float y por qué?Rutas de optimización de doble o flotante

Saludos cordiales.

+0

Si escribe su propio código en C++, ¿por qué no ha etiquetado la pregunta adecuadamente? ¿Me estoy perdiendo algo sutil? –

+0

@HighPerformanceMark Estoy revisando el código en python (en particular scipy source) y C++, y escribiendo mi propia rutina combinando varios métodos. Debería haber etiquetado con C++ también. – octoback

+1

Además de las cosas mencionadas, para división y raíz cuadrada, la diferencia en el rendimiento entre float y double es bastante grande. Pero esas operaciones deberían evitarse en el código de rendimiento de todos modos. – harold

Respuesta

6

A menudo la elección entre double y float se hace más en requisitos de espacio que la velocidad. Los procesadores modernos son capaces de operar en double bastante rápido.

Los flotantes pueden ser más rápidos que los dobles al usar instrucciones SIMD (como SSE) que pueden operar en múltiples valores a la vez. Además, si las operaciones son más rápidas que la tubería de memoria, los requisitos de memoria más pequeños de float acelerarán las cosas en general.

+1

La precisión también es una preocupación importante. Cambiar la precisión en los tipos de datos puede comprometer la precisión de los resultados en algunos casos. –

2

Otras veces que me he encontrado la necesidad de considerar la posibilidad de elegir entre dos tipos y flotar en términos de optimización incluyen:

  • redes. El envío de datos de doble precisión a través de una conexión de socket obviamente requerirá más tiempo que el envío de la mitad de esa cantidad de datos .
  • Los procesadores móviles e integrados solo pueden ser capaces de manejar altos cálculos de precisión simple de manera eficiente en un coprocesador.

Como se menciona en otra respuesta, los procesadores de escritorio modernos pueden manejar el procesamiento de precisión doble bastante rápido. Sin embargo, debe preguntarse si realmente se requiere el procesamiento de doble precisión . Trabajo con audio, y el único momento en que puedo pensar en dónde necesitaría procesar datos de doble precisión sería cuando se usan filtros de orden alto donde errores numéricos pueden acumularse. La mayoría de las veces esto se puede evitar prestando más atención al diseño del algoritmo. Hay, por supuesto, otras aplicaciones científicas o de ingeniería donde se requieren datos de precisión dobles para representar correctamente un enorme rango dinámico de .

Aún así, la cuestión de cuánto esfuerzo dedicar a considerar el tipo de datos a utilizar realmente depende de su plataforma de destino. Si la plataforma puede cruzarse a través de dobles con una sobrecarga insignificante y tienes memoria de sobra, entonces no hay necesidad de preocuparte. Perfile secciones pequeñas del código de prueba para descubrir.

2

En ciertos algoritmos de optimización, la elección entre double y float es no hecho más en las demandas de espacio que la velocidad. Por ejemplo, con métodos de penalización o barrera que se usan para métodos de puntos interiores en optimización no lineal, un float tiene una precisión insuficiente en comparación con un double, y usar float s en el algoritmo arrojará basura. Por esta razón, los métodos de penalización y barrera no se usaron en la década de 1960, pero se redescubrieron más tarde con el advenimiento del tipo de datos de doble precisión. (Para obtener más información sobre estos métodos, consulte Programación no lineal: técnicas secuenciales de minimización sin restricciones (Classics in Applied Mathematics) por Fiacco y McCormick.)

Otra consideración es el acondicionamiento de los sistemas lineales subyacentes resueltos en muchos algoritmos de optimización. Si los sistemas lineales que está resolviendo en algo así como una iteración de Newton están lo suficientemente mal acondicionados, no podrá obtener una solución precisa para esos sistemas.

Solo si la pérdida de precisión no pone en peligro sus valores numéricos debe considerar reemplazar double s con float s; incluso si las restricciones de espacio lo obligan a hacerlo, debe asegurarse de que la exactitud de sus resultados numéricos no se vea comprometida. Una vez que se asegura la precisión suficiente para los problemas en los que está trabajando, puede preocuparse por las optimizaciones de espacio y rendimiento. Puede usar el CUTEr test set para validar sus rutinas de optimización.

Cuestiones relacionadas