Los idiomas tienen conjuntos de características similares. La diferencia de rendimiento proviene del hecho de que Fortran dice que el alias no está permitido, a menos que se use una declaración EQUIVALENCE. Cualquier código que tenga alias no es válido para Fortran, pero depende del programador y no del compilador detectar estos errores. Por lo tanto, los compiladores de Fortran ignoran el posible alias de los punteros de memoria y les permiten generar código más eficiente. Eche un vistazo a este pequeño ejemplo 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;
}
}
Esta función sería más lenta que la contraparte de Fortran después de la optimización. ¿Porque? Si escribe valores en la matriz de salida, puede cambiar los valores de la matriz. Después de todo, los punteros pueden superponerse y apuntar a la misma porción de memoria (¡incluido el int
puntero!). El compilador de C se ve obligado a recargar los cuatro valores de la matriz desde la memoria para todos los cálculos.
En Fortran, el compilador puede cargar los valores de la matriz una vez y almacenarlos en registros. Puede hacerlo porque el compilador Fortran supone que los punteros / matrices no se superponen en la memoria.
Afortunadamente, la restrict
palabra clave y el alias estricto se han introducido en el estándar C99 para abordar este problema. También es compatible con la mayoría de los compiladores de C ++ en estos días. La palabra clave le permite dar al compilador una pista de que el programador promete que un puntero no se alias con ningún otro puntero. El medio-aliasing estrictas que las promesas programador que los punteros de diferente tipo nunca se superponen, por ejemplo, una double*
voluntad no se superponen con una int*
(con la excepción específica que char*
y void*
puede solaparse con cualquier cosa).
Si los usas obtendrás la misma velocidad de C y Fortran. Sin embargo, la capacidad de usar la restrict
palabra clave solo con funciones críticas de rendimiento significa que los programas C (y C ++) son mucho más seguros y fáciles de escribir. Por ejemplo, considere el código no válido de Fortran: CALL TRANSFORM(A(1, 30), A(2, 31), A(3, 32), 30)
que la mayoría de los compiladores de Fortran compilarán sin previo aviso, pero presenta un error que solo aparece en algunos compiladores, en algunos equipos y con algunas opciones de optimización.