Les langues ont des ensembles de fonctionnalités similaires. La différence de performances vient du fait que Fortran dit que l'aliasing n'est pas autorisé, sauf si une instruction EQUIVALENCE est utilisée. Tout code qui a un alias n'est pas Fortran valide, mais c'est au programmeur et non au compilateur de détecter ces erreurs. Ainsi, les compilateurs Fortran ignorent l'aliasing possible des pointeurs de mémoire et leur permettent de générer du code plus efficace. Jetez un 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 fonctionnerait plus lentement que l'homologue Fortran après optimisation. Pourquoi Si vous écrivez des valeurs dans le tableau de sortie, vous pouvez modifier les valeurs de la matrice. Après tout, les pointeurs peuvent se chevaucher et pointer vers le même bloc de mémoire (y compris le int
pointeur!). Le compilateur C est obligé de recharger les quatre valeurs de matrice à partir de la mémoire pour tous les calculs.
Dans Fortran, le compilateur peut charger une fois les valeurs de la matrice et les stocker dans des registres. Il peut le faire car le compilateur Fortran suppose que les pointeurs / tableaux ne se chevauchent pas en mémoire.
Heureusement, le restrict
mot clé et l'alias strict ont été introduits dans la norme C99 pour résoudre ce problème. Il est également bien pris en charge dans la plupart des compilateurs C ++ de nos jours. Le mot-clé vous permet d'indiquer au compilateur que le programmeur promet qu'un pointeur ne fait pas d'alias avec un autre pointeur. Les moyens stricts-aliasing que les promesses de programmeur que les pointeurs de type différent ne sera jamais chevauchement, par exemple double*
ne se chevauchent pas avec un int*
(à l'exception spécifique char*
et void*
peuvent se chevaucher avec quoi que ce soit).
Si vous les utilisez, vous obtiendrez la même vitesse de C et de Fortran. Cependant, la possibilité d'utiliser le restrict
mot clé uniquement avec des 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 non valide: CALL TRANSFORM(A(1, 30), A(2, 31), A(3, 32), 30)
que la plupart des compilateurs Fortran compileront avec plaisir sans avertissement, mais introduisent un bogue qui n'apparaît que sur certains compilateurs, sur certains matériels et avec certaines options d'optimisation.