Question

I ai commencer à utiliser Fortran (95) pour un code numérique (générer modules python). Voici un exemple simple:

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

J'ai trouvé que cela fonctionne très bien en 32 bits, mais lorsqu'il est compilé comme x86_64 il est environ 5 fois plus lent (macbook Core2Duo, le léopard des neiges, gfortran 4.2.3 de r.research.att.com). Je me suis finalement rendu compte que cela pourrait être dû à l'utilisation de type entier 32 bits au lieu du type natif, et même quand je remplacerai avec entier * 8, la 64 performance bit est seulement 25% pire que celui 32bit.

Pourquoi l'aide d'un nombre entier de 32 bits beaucoup plus lent sur une machine 64 bits? Y a-t-il des moulages implicites en cours avec l'indexation que je ne pourrais pas être au courant?

Est-ce toujours le cas que 64 bits sera plus lent que 32 bits pour ce type de code (j'ai été surpris à ce) - ou est-il une chance que je pourrais obtenir le 64 bit version compilée en cours d'exécution à la même vitesse ou plus rapide?

(question principale ) Est-il possible de déclarer un (entier) variable pour le type « natif » ... à savoir 32 bits lorsqu'il est compilé 32 bits, 64 bits lorsqu'il est compilé 64 bits dans Fortran moderne. Sans cela, il semble qu'il est impossible d'écrire du code Fortran portable qui ne sera pas beaucoup plus lent en fonction de la façon dont son compilé - et je pense que cela signifie que je vais devoir cesser d'utiliser Fortran pour mon projet. Je l'ai regardé et genre selected_kind mais pas été en mesure de trouver quelque chose qui fait cela.

[Edit:. Hit grande performance a été de l'emballage de f2py copie du tableau pour le lancer à partir de 64 bits à 32 bits int int, donc rien inhérent au Fortran]

Était-ce utile?

La solution

La réponse à votre « question principale » est de sélectionner l'option du compilateur correct d'avoir l'entier par défaut déclarée avec 32 ou 64 bits. Je ne l'utilise gfortran (je préfère G95, mieux encore un compilateur versé pour) donc je googlé et il semble que -fdefault entier-8 est l'option dont vous avez besoin.

Comme vous, je suis surpris que la version 64 bits est plus lente que la version 32 bits. Je n'ai rien éclairer sur ce point.

Autres conseils

Vraiment ont également essayé d'utiliser un 64 bits pour exécuter WATFOR 77 mais la mienne était complètement impossible.I obtenu un gf-FOR-compilateur pour mon 64 bits et essayé quelques options sur l'utilisation de Google donné plus tard une option pour utiliser gcc -mp 4.3 et 4.3 gfortran. Version qui était encore lent. Je vous conseille d'utiliser une machine 32 bits, ce qui est Fortran compactible pour exécuter vos programmes ou de mise upgrader votre 64 bits à 32 bits pour exécuter vos progs plus rapides et précises. Laissez continuer à rechercher de manière à obtenir une machine 64 bits runing campactibly avec WATFOR77 et sous-routines progs.

Alors que je ne l'ai pas fait des études approfondies, je ne l'ai pas vu de telles différences de grande vitesse.

Je suggère d'essayer une version plus récente de gfortran. La version 4.2 est antérieure (gfortran a commencé avec 4,0) et considérée comme obsolète. 4.3 et 4.4 sont beaucoup améliorés et plus de fonctionnalités. 4.4 est la version actuelle non-bêta. Un moyen facile de les obtenir sur un Mac est via MacPorts: les forfaits gcc43 et gcc44 comprennent gfortran. Les compilateurs sont installés comme gcc-MP-4.3, gfortran-MP-4.3, etc., afin de ne pas entrer en conflit avec d'autres versions. Ou vous pouvez essayer la dernière version de 4.5 sur la page wiki gfortran.

Intel Fortran est parfois nettement plus rapide que gfortran.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top