Pregunta

He estado empezando a usar Fortran (95) para un código numérico (generación de módulos de Python). Aquí está un ejemplo sencillo:

subroutine bincount (x,c,n,m)
  implicit none
  integer, intent(in) :: n,m
  integer, dimension(0:n-1), intent(in) :: x
  integer, dimension(0:m-1), intent(out) :: c
  integer :: i

  c = 0
  do i = 0, n-1
    c(x(i)) = c(x(i)) + 1 
  end do
end

He descubierto que este se comporta muy bien en 32 bits, pero cuando se compila como x86_64 Se trata de 5x más lenta (MacBook Pro Core 2 Duo, leopardo de las nieves, gfortran 4.2.3 de r.research.att.com). Finalmente me di cuenta que esto podría ser debido al uso de 32 bits de tipo entero en lugar del tipo nativo, y de hecho cuando se sustituyo con número entero * 8, el rendimiento de 64 bits es sólo el 25% peor que la de 32 bits.

¿Por qué es el uso de un entero de 32 bits de modo mucho más lento en una máquina de 64 bits? ¿Hay conversiones implícitas pasando con la indexación de que podría no ser consciente de?

¿Es siempre el caso que el 64 bits será más lento que el de 32 bits para este tipo de código (Me sorprendió esto) - o hay una posibilidad de que pueda obtener la versión compilada de 64 bits que se ejecuta la misma velocidad o más rápido?

( pregunta principal ) ¿Hay alguna forma de declarar un (entero) variable sea del tipo 'nativo' ... es decir, de 32 bits cuando se compila 32 bits, 64 bits cuando se compila 64 bits en FORTRAN moderna. Sin esto parece que es imposible escribir código FORTRAN portátil que no va a ser mucho más lento dependiendo de cómo su compilado - y creo que esto significa que voy a tener que dejar de usar Fortran para mi proyecto. He mirado amable y selected_kind pero no podido encontrar cualquier cosa que hace esto.

[Editar:. La gran impacto en el rendimiento fue del envoltorio f2py copiar la matriz para su emisión de int de 64 bits a 32 bits int, por lo que nada inherente al FORTRAN]

¿Fue útil?

Solución

La respuesta a su 'pregunta principal' es seleccionar la opción de compilador correcta para tener el número entero por defecto declarado con 32 o 64 bits. Nunca uso gfortran (prefiero g95, incluso mejor un compilador de pago para) así que busqué en Google y parece que -fdefault entero-8 es la opción que necesita.

Al igual que usted me sorprende que la versión de 64 bits es más lento que la versión de 32 bits. No tengo nada que ilumina en ese punto.

Otros consejos

En realidad también han intentado usar una de 64 bits para ejecutar watfor 77 pero la mía era completamente impossible.I consiguió un GF-PARA-compilador para mi de 64 bits y probado algunas opciones en Google ans uso posterior dada una opción para utilizar gcc -mp 4.3 y 4.3 gfortran. Versión que todavía era lento. Voy aconsejo que utiliza una máquina de 32 bits, que es FORTRAN compactable para ejecutar sus programas de grado o su des de 64 bits a 32 bits para ejecutar sus progs más rápidas y precisas. Deje que seguir investigando con el fin de conseguir una máquina de 64 bits runing campactibly con WATFOR77 y subrutinas progs.

Si bien no he hecho estudios minuciosos, no he visto tales diferencias gran velocidad.

Recomiendo probar una nueva versión de gfortran. La versión 4.2 es anterior (gfortran comenzó con 4,0) y se considera obsoleta. 4.3 y 4.4 son mucho mejor y tener más funciones. 4.4 es la versión actual no beta. Una manera fácil de obtenerlos en un Mac es a través de MacPorts: los paquetes gcc43 y gcc44 incluyen gfortran. Los compiladores se instalan como gcc-mp-4,3, gfortran-mp-4,3, etc., a fin de no entrar en conflicto con otras versiones. O puede probar la última versión de 4.5 de la página wiki gfortran.

Intel FORTRAN veces es significativamente más rápido que gfortran.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top