Metodología
El cómputo paralelo se utiliza para la resolución de problemas de una escala que no sería realista o costo-efectivo para otros sistemas. Sin embargo, como cualquier herramienta, impone restricciones en la forma en que el problema se formula para resolverlo, así como de los tipos de solución que son posibles. No es fácil apreciar las dificultades que se enfrentan al no comprender el proceso de desarrollo paralelo. El diseño de un programa paralelo para la resolución de un problema dado involucra una serie de pasos:
- Nivel conceptual o de modelo. Se delínea el dominio del problema y se selecciona una estrategia de solución. La solución puede ser descrita en términos de entidades abstractas, asociaciones lógicas entre entidades, y la atribución de valores abtractos. En este nivel laboran quienes se dedican a la modelación, proponiendo un modelo normalmente matemático como solución al problema.
- Nivel algorítmico y de datos. Consiste en la formulación de un algoritmo para la solución del problema, así como de las estructuras de datos que se operan por el algoritmo. El algoritmo se especifica como pasos secuenciales o concurrentes que resuelven el problema en base al modelo del nivel anterior. Aun cuando las operaciones del algoritmo son en cierto modo todavía abstractas, se aplican a estructuras de datos (por ejemplo, matrices) con rangos específicos de valores.
- Nivel programa o de implementación. El algoritmo del nivel anterior se re-expresa utilizando las construcciones sintácticas de un lenguaje de programación. Esta etapa sirve como puente entre la representación algorítmica que realiza manipulaciones abtractas sobre datos, y las operaciones físicas que llevan a cabo tales manipulaciones en la realidad. La solución se implementa en términos del lenguaje de programación: estructuras de datos, operaciones básicas, y tipos de datos.
- Nivel Proceso. El programa implementado en el nivel anterior se compila para traducirlo a una forma ejecutable. Finalmente, el programa se ejecuta.
Nótese que todos estos pasos y re-estructuraciones tienden a complicar el desarrollo de programas paralelos. Es necesario partir de un modelo abstracto, el cual se reformula como un algoritmo, que se transforma en l\'ineas de código en un lenguaje de programación, para finalmente compilarse, traduciéndose en código ejecutable. Cada re-estructuración es fuente potencial de error y distorsión. De hecho, la efectividad de la re-estructuración (y del desarrollo de un programa paralelo como un todo) depende directamente de cómo se realice el mapeo entre representaciones de diferentes niveles.
Los pasos de modelo abstracto a algoritmo, y de programa a proceso parecen no representar problemas especiales. El primer paso, que se realiza en forma lógica, depende de la habilidad para descomponer el modelo abstracto en secuencias adecuadas de representaciones y operaciones de alto nivel. El tercer paso depende de la precisión con que el compilador traduzca las construcciones en lenguaje de programación a instrucciones de máquina.
Sin embargo, el paso entre la representación algorítmica y el programa presenta especiales dificultades, ya que involucra una traducción de elementos lógicos a una forma cuasi-física. Este paso depende de la capacidad del lenguaje de programación para expresar el algoritmo, y de la habilidad del programador para entender el lenguaje y los métodos computacionales que representa. Es precisamente en este paso, de algoritmo a programa, donde se hace necesario un estudio y análisis profundo.
A grandes rasgos, y para el caso particular de este proyecto, se plantean algunas actividades a realizar, que tienen la intención de promover y aplicar el estudio del paralelismo. Inicialmente, es necesario instalar el cluster para la enseñanza e investigación. En seguida, se requiere caracterizar el cluster, es decir, medir, conocer y documentar las capacidades y limitaciones propias del cluster como plataforma experimental. Más adelante, el proyecto plantea formar un repositorio de experiencia de diseño paralelo a partir de los casos de estudio realizados, mediante documentar toda decisión de diseño paralelo, tanto a nivel hardware como a nivel software. El objetivo es conjuntar el conocimiento y la experiencia de diseño para proponer una base metodológica experimental para el desarrollo del paralelismo, mediante la posible generalización de los resultados obtenidos.