Ces langues ont des caractéristiques similaires. La différence de performance vient du fait que le Fortran interdit l'aliasing, sauf si une instruction EQUIVALENCE est utilisée. Tout code comportant un aliasing n'est pas un Fortran valide, mais c'est au programmeur et non au compilateur de détecter ces erreurs. Ainsi, les compilateurs Fortran ignorent l'aliasing éventuel des pointeurs mémoire et leur permettent de générer un code plus efficace. Jetez un coup d'oeil à ce petit exemple en C :
void transform (float *output, float const * input, float const * matrix, int *n)
{
int i;
for (i=0; i<*n; i++)
{
float x = input[i*2+0];
float y = input[i*2+1];
output[i*2+0] = matrix[0] * x + matrix[1] * y;
output[i*2+1] = matrix[2] * x + matrix[3] * y;
}
}
Cette fonction s'exécuterait plus lentement que son homologue en Fortran après optimisation. Pourquoi ? Si vous écrivez des valeurs dans le tableau de sortie, vous risquez de modifier les valeurs de la matrice. Après tout, les pointeurs pourraient se chevaucher et pointer sur le même morceau de mémoire (y compris le tableau de sortie). int
pointeur !). Le compilateur C est obligé de recharger les quatre valeurs de la matrice depuis la mémoire pour tous les calculs.
En Fortran, le compilateur peut charger les valeurs de la matrice une fois et les stocker dans des registres. Il peut le faire car le compilateur Fortran suppose que les pointeurs/réseaux ne se chevauchent pas en mémoire.
Heureusement, le restrict
et l'anticrénelage strict ont été introduits dans la norme C99 pour résoudre ce problème. Ils sont également bien supportés par la plupart des compilateurs C++ de nos jours. Le mot-clé permet de donner au compilateur une indication que le programmeur promet qu'un pointeur ne s'aliasera pas avec un autre pointeur. L'aliasage strict signifie que le programmeur promet que des pointeurs de type différent ne se chevaucheront jamais, par exemple un pointeur double*
ne se chevauchera pas avec une int*
(avec l'exception spécifique que char*
y void*
peut se chevaucher avec n'importe quoi).
Si vous les utilisez, vous obtiendrez la même vitesse en C et en Fortran. Cependant, la possibilité d'utiliser les restrict
Le fait de n'utiliser le mot-clé qu'avec les fonctions essentielles aux performances signifie que les programmes C (et C++) sont beaucoup plus sûrs et plus faciles à écrire. Par exemple, considérez le code Fortran invalide : CALL TRANSFORM(A(1, 30), A(2, 31), A(3, 32), 30)
que la plupart des compilateurs Fortran compileront sans aucun avertissement, mais qui introduit un bogue qui n'apparaît que dans certains compilateurs, sur certains matériels et avec certaines options d'optimisation.
65 votes
Notreally subjective à partir des réponses données ci-dessous. Le titre correct est "Existe-t-il des raisons architecturales fondamentales pour lesquelles un compilateur Fortran pourrait produire un code mieux optomisé qu'un compilateur C" mais c'est juste du pinaillage.
4 votes
La question du titre n'est pas tant subjective qu'il s'agit d'un malentendu, je pense. La question plus détaillée n'est pas subjective.
1 votes
Je ne pense pas que quiconque puisse apprendre grand-chose de tout cela, si ce n'est que la réponse est "Oui" et "Non" à la fois, et qu'elle varie en fonction du compilateur, de la source, du processeur, de la disposition de la mémoire, etc etc etc. Yawn.
1 votes
Je ne pense pas que la question ou les réponses soient subjectives. Mais si vous pensez que ce drapeau aide quelqu'un, je suis d'accord.
0 votes
La question est trop large (Fortran est plus rapide que C dans quel domaine de problèmes ?), mais je ne pense pas que la discussion suivante soit subjective. Nous pouvons produire un petit code qui prouve/défend n'importe quelle affirmation, tant que le problème est suffisamment spécifique.
1 votes
Notez que vous n'avez pas besoin d'écrire votre programme en Fortran si tout ce que vous voulez faire est d'appeler certaines bibliothèques Fortran. On peut facilement appeler du code Fortran depuis le C, il suffit de se souvenir de la manipulation des noms, du passage de chaque variable par référence et de l'ordre différent des matrices.
0 votes
Bien. Aussi, les cordes sont un peu bizarres.
1 votes
Pourquoi les débutants posent-ils toujours ce genre de questions ? La moitié du temps, ils s'inquiètent de fonctions absurdes qui prennent quelques cycles toutes les deux heures.
3 votes
Bien que vous et moi connaissions déjà la réponse, c'est une question qui se pose à la plupart des gens au début de leur carrière et il est important de comprendre la réponse. Plutôt que de poster un commentaire dédaigneux, pourquoi ne pas trouver une réponse avec laquelle vous êtes d'accord et donner +1.
0 votes
@MarkJ : bon point, j'ai voté pour fermer comme non constructif.
0 votes
Puis-je ajouter une vue romantique (en tant que programmeur fortran). À l'époque, nous codions pour des chiffres et non pour des applications, comme le veut la vision moderne. Nous connaissions, parce que nous le pouvions, le mappage mémoire de n'importe quelle matrice, c'est pourquoi nous pouvions utiliser des commons et imiter les pointeurs C. Et pour répondre à la question : oui, à cette époque, vous aviez des compilateurs optimisés pour le fortran. Mais moins romantique : obtenir un blas ou un lapack dans n'importe quel autre langage de programmation.
0 votes
Sur un processeur moderne avec prédiction de branchement, mémoire hiérarchique et longs pipelines, la réponse est assurément "non". Le code C a tendance à être plus rapide que le Fortran, même pour les travaux numériques. Mais il existe d'autres raisons de choisir Fortran : C est un assembleur de haut niveau semi-portable. Le Fortran est un langage de haut niveau qui est très portable, très lisible et plus facile à déboguer. Il offre des performances élevées avec moins d'efforts et est beaucoup plus facile à utiliser que le C. Mais plus rapide ? Pas en 2015. Le problème d'aliasing des pointeurs en C est pris en charge par la conception des processeurs modernes et les compilateurs C. Il ne fait pas autant de mal qu'en 1980.
0 votes
Fortran est un marteau-pilon, il fait quelques choses de bien. Le C est un couteau suisse. Si je veux accéder à des algorithmes avec des fonctions de quadruple précision, distribuées/parallélisées, blas, linpack ou dsp aussi rapidement que possible sans me soucier des pointeurs nuls et des pointeurs vers les pointeurs vers les pointeurs, le fortran gagne. Même les bibliothèques de traitement numérique sous-jacentes de Matlabs utilisent toujours du code fortran.
0 votes
Je ne suis pas du tout un expert en la matière (optimisations de très bas niveau - c'est-à-dire au niveau des registres), et j'ai trouvé les réponses très intéressantes.
0 votes
... suite ! ... Mais alors que je suis sûr que cela a dû être un sujet de débat passionné, cela me semble très peu pertinent aujourd'hui car le paysage matériel d'aujourd'hui est très différent. De nos jours, la disponibilité de langages spécifiques aux GPU/APU comme OpenCL et CUDA rend la question de savoir si le C ou le FORTRAN est plus rapide discutable. Ni l'un ni l'autre n'est le langage le plus rapide pour le traitement des chiffres, par un facteur de 10 à 100+, simplement parce qu'ils ne fonctionnent pas sur du matériel GPU/APU.