scieee AI-readable full text Open interactive document viewer

Desarrollo e integración de funciones externas para acelerar tiempos de ejecución de modelos Vensim

Manteola Llamas, Arturo

Abstract

Grado en Ingeniería Informática

Full text

ESCUELA DE INGENIER´ IA INFORM ´ ATICA DE VALLADOLID DESARROLLO E INTEGRACI ´ ON DE FUNCIONES EXTERNAS PARA ACELERAR TIEMPOS DE EJECUCI ´ ON DE MODELOS VENSIM Trabajo de Fin de Grado Grado en Ingenier´ ıa Inform´ atica Menci´ on Ingenier´ ıa de Software Alumno: Arturo Manteola Llamas Tutor: C´ esar Llamas Bello 2021 2 Resumen La simulaci´ on de sistemas din´ amicos es una disciplina dentro de la ingenier´ ıa que trata de conseguir y hacer funcionar modelos que permiten predecir el comportamiento tanto de sistemas por construir como sistemas existentes, pero tambi´ en permite profundizar en c´ omo comprendemos sistemas que ya existen consiguiendo mayores vol´ umenes de datos a analizar de los que podemos obtener de la realidad. Sus ´ areas de aplicaci´ on incluyen sistemas f´ ısicos, qu´ ımicos y modelos econ´ omico sociales del mundo real entre muchos otros. En este ´ ultimo contexto, el proyecto LOCOMOTION trata de proporcionar modelos y simulaciones que permitan ayudar a tomar decisiones a los agentes pol´ ıticos, y tambi´ en a concienciar al p´ ublico de las consecuencias del cambio clim´ atico entre otros. Uno de los grandes problemas de la simulaci´ on de estos sistemas es la gran cantidad de tiempo y recursos que se pueden llegar a requerir para obtener simulaciones de modelos complejos con grandes cantidades de datos de entrada. En este proyecto se aborda la construcci´ on y el dise˜ no de una biblioteca de funciones para el software que se emplea en el proyecto LOCOMOTION, que es Vensim. La finalidad es reducir los cuellos de botella de potencia de c´ alculo mediante una extensi´ on DLL de Vensim que incluya las funciones con mayor potencial de mejora y que permita su ampliaci´ on en el futuro. Al evaluar las prestaciones de esta biblioteca sencilla se ha podido comprobar que el uso que se hace de OpenBlas mediante la DLL dentro de Vensim permite reducir el tiempo de c´ omputo de la operaci´ on que consume m´ as tiempo hasta el 50.12 % del tiempo en el caso de prueba m´ as grande, esperando mejoras mayores en modelos con mayores vol´ umenes de datos. 3 4RESUMEN Abstract Dynamic system simulation is a discipline within the engineering field that focuses on making models that allow predicting the behaviour of both systems to be built or existing systems, but they also serve the purpose of making us learn about systems by letting us gather larger volumes of data to analyze than what we can get from observing reality. It can be applied on physical, chemical or socioeconomic models among many others. The LOCOMOTION project delves into socioeconomic models with the purpose of providing models and simulations that help political agents make decisions, and raising public awareness about climate change among others. One of the biggest problems in the simulation of these systems is the great amount of time and resources that may be needed to get simulations from complex models with huge amounts of input data. This project focuses on the design and developement of a library of functions for the software used in the LOCOMOTION project, Vensim. Its purpose is to reduce bottlenecs caused by a lack of computing power by tackling the functions deemed to have the greatest margin of improvement and that allows future expansions to be made. When evaluating the performance of this simple library it has been possible to verify that the use given to OpenBlas within the DLL used by Vensim reduces computation time by up to 50,12 % of the time in the largest test case, with the expectations that having bigger input data volumes means greater reductions in time. 5 6ABSTRACT Presentaci´ on La simulaci´ on de sistemas din´ amicos es una disciplina dentro de la ingenier´ ıa que trata de conseguir y hacer funcionar modelos que permiten predecir el comportamiento tanto de sistemas por construir como sistemas existentes, pero tambi´ en permite profundizar en c´ omo comprendemos sistemas que ya existen consiguiendo mayores vol´ umenes de datos a analizar de los que podemos obtener de la realidad. Sus ´ areas de aplicaci´ on incluyen sistemas f´ ısicos, qu´ ımicos y modelos econ´ omico sociales del mundo real entre muchos otros. En este ´ ultimo contexto, el proyecto LOCOMOTION trata de proporcionar modelos y simulaciones que permitan ayudar a tomar decisiones a los agentes pol´ ıticos, y tambi´ en a concienciar al p´ ublico de las consecuencias del cambio clim´ atico entre otros. El Grupo de Energ´ ıa, Econom´ ıa y Din´ amica de Sistemas (GEEDS) de la Universidad de Valladolid est´ a formado por un grupo de profesores e investigadores. Participan en un programa de investigaci´ on europeo, LOCOMOTION, que trata entre otras muchas cosas de completar los modelos desarrollados en otro proyecto de investigaci´ on europeo MEDEAS. Uno de los grandes problemas de la simulaci´ on de estos sistemas es la gran cantidad de tiempo y recursos que se pueden llegar a requerir para obtener simulaciones de modelos complejos con grandes cantidades de datos de entrada. En este proyecto se aborda la construcci´ on y el dise˜ no de una biblioteca de funciones para el software que se emplea en el proyecto LOCOMOTION, que es Vensim. La finalidad es reducir los cuellos de botella de potencia de c´ alculo mediante una extensi´ on DLL de Vensim que incluya las funciones con mayor potencial de mejora y que permita su ampliaci´ on en el futuro. Al evaluar las prestaciones de esta biblioteca sencilla se ha podido comprobar que el uso que se hace de OpenBlas mediante la DLL dentro de vensim permite reducir el tiempo de c´ omputo de la operaci´ on que representa el mayor cuello de botella, inversi´ on matricial, hasta el 50.12 % del tiempo en el caso de prueba m´ as grande, esperando mejoras mayores en modelos con mayores vol´ umenes de datos. Estructura de la memoria En este documento se recogen tanto los resultados de investigar acerca de bibliotecas de ´ algebra lineal, estudiar con detalle el funcionamiento de los DLLs de Vensim para poder utilizar funciones externas y acerca de los entornos de programaci´ on disponibles para la creaci´ on de DLLs en Windows como la planificaci´ on y el desarrollo de un DLL para Vensim con varias funciones. En el primer cap´ ıtulo se pone en contexto lo que es Vensim, los usos que tiene, sus puntos fuertes y sus problemas. Tambi´ en se habla de los objetivos del trabajo, la planificaci´ on de este y se entra en algo de profundidad sobre lo que se espera conseguir en cada iteraci´ on del DLL como el tiempo que se espera tardar. 7 8Presentaci´ on El segundo cap´ ıtulo est´ a dedicado a los resultados de comparar las bibliotecas de ´ algebra lineal disponibles para averiguar cu´ al es la m´ as adecuada para el proyecto seg´ un ciertos criterios preestablecidos. Una vez elegida la biblioteca se habla de particularidades que tiene y que hay que tener en cuenta. El tercer cap´ ıtulo est´ a dedicado a analizar mucho m´ as en profundidad Vensim para que se pueda entender qu´ e aspecto tiene, c´ omo se modela en el y, sobre todo, la estructura y el funcionamiento del c´ odigo de ejemplo para la creaci´ on de un DLL. Tambi´ en se habla de otros programas utilizados para el desarrollo del DLL, de los modelos que ser´ an utilizados como casos de prueba y del desarrollo del primer prototipo. El cuarto cap´ ıtulo explica el resto de detalles del software utilizado, las medidas iniciales de rendimiento obtenidas para la inversi´ on matricial y del desarrollo del segundo prototipo. En el quinto cap´ ıtulo se habla de las funciones que se desean realizar durante el trabajo de forma m´ as concreta, y se explica al detalle el funcionamiento y el desarrollo de la funci´ on de inversi´ on matricial, junto a las pruebas utilizadas y un an´ alisis de la mejora de rendimiento que aporta la funci´ on. Adem´ as, se habla de los otros dos prototipos, de todos los avances realizados en ellos y los problemas que han impedido completarlos en el tiempo l´ ımite para el trabajo. En el sexto cap´ ıtulo se realiza una retrospecci´ on del proyecto y se habla de las posibles mejoras que se pueden realizar en trabajos futuros. A continuaci´ on se encuentran los anexos que explican c´ omo instalar y utilizar el software que se ha creado, mencionado y utilizado durante este trabajo. Y, por ´ ultimo, se dispone de una bibliograf´ ıa con las referencias m´ as ´ utiles usadas durante el proyecto. Agradecimientos Lo primero agradecer a mi familia todo el apoyo dado durante la carrera, asegur´ andose de que siempre tenga recursos suficientes para poder avanzar sin problemas, y a mi novia, quien ha estado siempre anim´ andome y apoy´ andome en los momentos malos. Tambi´ en agradecer a todos los amigos que he conocido en la carrera, motiv´ andome a seguir adelante, pudiendo mantener conversaciones interesantes tanto de inform´ atica como de cualquier otra cosa y con quienes he vivido muchos momentos que no olvidar´ e. Quiero agradecer la oportunidad que ha sido participar en este interesante proyecto al grupo GEEDS, quienes han aportado mucho al avance de este interesante proyecto y se han ofrecido a apoyarlo con una beca. Quiero agradecer a mi tutor de este Trabajo de Fin de Grado, C´ esar Llamas, toda la ayuda ofrecida durante el desarrollo del proyecto. Siempre ha estado disponible para resolver todas las dudas que me han ido surgiendo y hemos tenido unas reuniones muy productivas para hablar del rumbo que este trabajo estaba tomando. Tambi´ en agradecer a Jes´ us Vegas su participaci´ on en muchas de estas reuniones y sus contribuciones. Muchas gracias a ambos. Y por ´ ultimo agradecer al resto de profesores de la escuela de ingenier´ ıa inform´ atica quienes se han esforzado en ense˜ narnos conceptos muy importantes para nuestro futuro sin los cuales este trabajo hubiera resultado imposible. ´ Indice general Resumen 3 Abstract 5 Presentaci´ on 7 Estructuradelamemoria ..................................... 7 Lista de figuras 13 Lista de tablas 15 1. Objetivos, contexto y propuesta 1 1.1. Problemas de la simulaci´ ondesistemas .......................... 1 1.2. Optimizaci´ on de c´ alculosenVensim............................ 1 1.3. Propuesta: Ampliar mediante DLLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.4. Objetivos .......................................... 2 1.5. Planificaci´ ondeltrabajo .................................. 3 1.5.1. Primer prototipo: Conexi´ onconVensim...................... 3 1.5.2. Segundo prototipo: Integraci´ ondeOpenBlas ................... 4 1.5.3. Tercer prototipo: Integraci´ on de OpenBlas en Vensim . . . . . . . . . . . . . . . 4 1.5.4. Tercer prototipo (II): Desarrollo de la funci´ on de inversi´ on............ 4 1.5.5. Desarrollo de los manuales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.5.6. Cuarto prototipo: Almacenamiento de matrices en la DLL . . . . . . . . . . . . 5 1.5.7. Quinto prototipo: Desarrollo de la funci´ onSUM ................. 5 9 16 ´ INDICE DE CUADROS Cap´ ıtulo 1 Objetivos, contexto y propuesta En este cap´ ıtulo se va a explicar cu´ ales son los objetivos de este proyecto, el problema que se intenta solucionar y la planificaci´ on del trabajo que se ha realizado. Para ello, se dar´ a algo de contexto relacionado con el problema primero. Luego se listar´ an los prototipos que se planearon hacer, mencionando de cada uno la funcionalidad del prototipo, el objetivo que se logra al finalizar el prototipo, la estimaci´ on de tiempo para realizarlo y el tiempo invertido en desarrollarlo. 1.1. Problemas de la simulaci´ on de sistemas La simulaci´ on de sistemas din´ amicos trata de modelar un sistema din´ amico cuyas variables cambian con el tiempo y resolver el valor que tomar´ an estas variables tras el paso del tiempo. El modelo que dicta c´ omo interact´ uan las variables entre s´ ıyc´ omo son modificadas a trav´ es del tiempo es independiente de el estado inicial de las variables. En la pr´ actica se usa para cosas muy diversas como pueden ser predecir el estado en un futuro cercano de un sistema real y poder actuar con antelaci´ on, para animaciones, videojuegos, averiguar el resultado que se obtendr´ ıa de un hipot´ etico caso inicial o para insertar estados iniciales con cierto nivel de aleatoriedad. Este ´ ultimo caso permitir´ ıa encontrar patrones o relaciones que no son aparentes con los datos que se puedan llegar a extraer de la realidad. Todos estos casos pueden llegar a exigir cierto nivel de optimizaci´ on, bien sea por la necesidad de que la simulaci´ on se adelante a los acontecimientos de la realidad o tenga que llevar cierto ritmo o porque se realicen grandes cantidades de simulaciones con grandes cantidades de datos iniciales diferentes. 1.2. Optimizaci´ on de c´ alculos en Vensim Vensim [2] es un programa orientado al modelado de sistemas din´ amicos cuya primera versi´ on fue lanzada en 1990. Si bien es cierto que todos estos a˜ nos de actualizaciones han culminado en un programa con muchas funciones muy ´ utiles a la hora de desarrollar modelos, tambi´ en hay que tener en cuenta que 1 2CAP´ ITULO 1. OBJETIVOS, CONTEXTO Y PROPUESTA este programa no fue pensado para el c´ omputo de vol´ umenes de datos de tama˜ nos tan grandes como los que podemos obtener hoy en d´ ıa. Por estas razones las funciones encargadas de operaciones matem´ aticas complejas no est´ an optimizadas, mucho menos para grandes vol´ umenes de datos. Adem´ as, Vensim incluye funciones con funcionalidades muy diversas pero que implican recorrer matrices varias veces de forma muy dispersa, lo cual constituye un gran problema en el caso de que esta matriz sea tan grande que no pueda estar cargada entera en la memoria del programa. 1.3. Propuesta: Ampliar mediante DLLs Por suerte, Vensim ofrece la posibilidad de importar al programa funciones creadas por el usuario por medio de un DLL, que tiene que seguir cierta estructura y cumplir ciertas condiciones para funcionar adecuadamente con el programa. [7] Adem´ as, Vensim ofrece una plantilla de ejemplo con diversas funciones b´ asicas. Esta plantilla est´ a autodocumentada y es a su vez un manual acerca de c´ omo crear estas funciones externas definidas por el usuario. Teniendo en cuenta que los cuellos de botella se encuentran en operaciones complejas con matrices muy grandes, la propuesta realizada para mejorar el rendimiento de Vensim es encontrar una biblioteca de funciones ya creada que nos ofrezca operaciones matriciales ya optimizadas y usarla para la creaci´ on de un DLL que ofrezca alternativas a las funciones de Vensim pero con un rendimiento mayor, especialmente en los casos de matrices de gran tama˜ no. 1.4. Objetivos Antes de realizar la planificaci´ on del trabajo, se propusieron una serie de objetivos que se quiere cumplir con el proyecto. El objetivo principal es la propuesta realizada por GIR GEEDS consistente en crear un DLL para acelerar el c´ alculo de inversi´ on matricial en Vensim. El resto de objetivos han sido resultado de pensar en los requisitos necesarios para llegar a crear el DLL, en los pasos a seguir o en las posibles ampliaciones de este en caso de haber tiempo para realizarlas. Los objetivos propuestos han sido los siguientes: Realizar un estudio de las librer´ ıas disponibles que permitan realizar ese tipo de c´ alculos. Realizar un estudio de la tecnolog´ ıa disponible para la creaci´ on de DLLs. Crear un DLL que permita a˜ nadir funciones externas a Vensim. Desarrollar una funci´ on externa que permita realizar la operaci´ on de inversi´ on matricial en menor tiempo que Vensim para matrices grandes. 1.5. PLANIFICACI ´ ON DEL TRABAJO 3 Desarrollar una funci´ on externa que permita colapsar dimensiones de una matriz en menor tiempo que Vensim para matrices grandes. Redactar un manual de instalaci´ on para la librer´ ıa de c´ alculo utilizada. Redactar un manual de uso de las funciones externas creadas. Crear una serie de funciones dentro del DLL que permitan almacenar matrices dentro del espacio de memoria del DLL. 1.5. Planificaci´ on del trabajo En cuanto a la cantidad de tiempo disponible para realizar el proyecto se decidi´ o dedicar 15 horas semanales durante un tiempo de entre tres y cuatro meses. Debido a que se plantearon metas que conseguir basadas en las metas anteriores, fue f´ acil ver que el modelo de planificaci´ on m´ as apropiado para el proyecto es uno basado en prototipos, ya que se puede definir un prototipo para cada una de estas metas y estas metas tienen una naturaleza iterativa. Adem´ as, esto permite estimar cu´ anto tiempo va a llevar realizar el proyecto sumando el tiempo esperado necesario para completar cada uno de estos prototipos. A continuaci´ on se explicar´ an con poco detalle los prototipos relacionados con cada meta. Al principio del proyecto se definieron 6 prototipos, aunque durante el desarrollo la mayor parte de lo que era el cuarto prototipo (aqu´ ı nombrado ((Tercer prototipo (II)))) se desarroll´ o durante el tercer prototipo de manera que la finalizaci´ on del tercer prototipo result´ o ser casi simult´ anea a la finalizaci´ on del siguiente prototipo planeado. Es por eso que el orden de los prototipos sigue el orden de los 5 desarrollados durante el proyecto pero se ha dividido el tercer prototipo en dos para reflejar la planificaci´ on. Tambi´ en se mencionar´ a la estimaci´ on del tiempo necesario para completar cada uno de los prototipos junto a el tiempo que llev´ o completarlos. Los prototipos ser´ an explicados con mucho m´ as detalle en cap´ ıtulos posteriores. 1.5.1. Primer prototipo: Conexi´ on con Vensim El primer prototipo que se desea obtener se detalla en el Cap´ ıtulo 3 y en el se pretende simplemente compilar y conectar la plantilla que nos ofrece Vensim al propio Vensim, ya que la plantilla va a ser usada como base para el desarrollo. Completar este prototipo significa que se ha encontrado una herramienta de desarrollo y compilaci´ on adecuada y que todos los bugs que surgen de que la plantilla no est´ a completamente actualizada han sido solucionados. Dentro del desarrollo de este prototipo se incluye el tiempo estimado y utilizado para investigar acerca de las herramientas de desarrollo de DLLs y el tiempo necesario para configurarlas adecuadamente. 4CAP´ ITULO 1. OBJETIVOS, CONTEXTO Y PROPUESTA Tiempo estimado: Dos semanas. Tiempo utilizado: Tres semanas. 1.5.2. Segundo prototipo: Integraci´ on de OpenBlas El segundo prototipo plantea la creaci´ on de un programa muy simple que muestre en una terminal el resultado de una operaci´ on realizada a trav´ es de OpenBlas. Completar este prototipo significa que se ha logrado instalar OpenBlas de una forma compatible con el entorno de desarrollo que se ha usado, y que ahora se dispone de un peque˜ no entorno de pruebas donde poder realizar operaciones sencillas en OpenBlas para comprobar sus resultados de forma directa e inmediata Dentro del desarrollo de este prototipo se incluye el tiempo usado para la investigaci´ on acerca de la librer´ ıa a usar, adem´ as de la instalaci´ on de esta. Se menciona el uso de OpenBlas en este documento, sin embargo a la hora de planificar a´ un no se hab´ ıa decidido la librer´ ıa concreta a utilizar, por lo que el nombre de este prototipo era ((Integraci´ on de la librer´ ıa)). Tiempo estimado: Tres semanas. Tiempo utilizado: Tres semanas. . 1.5.3. Tercer prototipo: Integraci´ on de OpenBlas en Vensim El tercer prototipo se podr´ ıa considerar una combinaci´ on de los dos anteriores, y el objetivo es crear un DLL usado por Vensim en el que se ejecute una llamada a una funci´ on de OpenBlas. Completar este prototipo significa que es posible integrar bibliotecas externas en Vensim a trav´ es de un DLL. Tiempo estimado: Una semana. Tiempo utilizado: Cuatro semanas. 1.5.4. Tercer prototipo (II): Desarrollo de la funci´ on de inversi´ on Este prototipo ser´ a el primer prototipo que pueda ser usado en el proyecto, y el objetivo es crear un DLL que pueda realizar la operaci´ on de inversi´ on matricial. Completar este prototipo significa que ya tenemos un artefacto directamente ´ util, desde el que se pueden realizar pruebas para comprobar el rendimiento de Vensim con y sin DLL y, en caso de que se logre alguna mejora, integrarlo en un proyecto real. Tiempo estimado: Dos semanas. Tiempo utilizado: Dos d´ ıas (Al realizar el anterior prototipo, se realiz´ o gran parte de este). 1.5. PLANIFICACI ´ ON DEL TRABAJO 5 1.5.5. Desarrollo de los manuales Tras tener un DLL que ya puede ser incorporado al proyecto, lo siguiente es redactar un manual de uso y de instalaci´ on. Una vez realizado, se plane´ o una reuni´ on con un par de integrantes del equipo para darles el manual de instalaci´ on y observar c´ omo interact´ uan con el. Mientras lo instalan, tomar nota de los puntos donde han tenido problemas, las dudas que han tenido y las sugerencias que realicen al final de la reuni´ on. El manual ser´ a redactado en ingl´ es para su uso de forma internacional. Tiempo estimado: Una semana. Tiempo utilizado: Dos semanas. 1.5.6. Cuarto prototipo: Almacenamiento de matrices en la DLL El cuarto prototipo propone crear una forma alternativa de llamada a la funci´ on, mediante la cual se pueden ahorrar movimientos de matrices entre el DLL y Vensim. Completar este prototipo supone la base para una forma alternativa de uso del DLL que se podr´ a ampliar en un futuro, y que puede aportar una mejora de rendimiento notable en ciertas situaciones. Tiempo estimado: Dos semanas. Tiempo utilizado: Cuatro semanas. 1.5.7. Quinto prototipo: Desarrollo de la funci´ on SUM El quinto prototipo tiene como objetivo crear una versi´ on de una funci´ on ya existente en Vensim, que pese a ser m´ as restrictiva en cuanto al n´ umero de cosas que puede realizar, sea m´ as eficiente que Vensim en los casos en los que sea adecuado usarla. Completar este prototipo supone tener otra mejora aplicable directamente al proyecto. Tiempo estimado: Dos semanas. Tiempo utilizado: Una semana. 1.5.8. Presupuesto Se ha utilizado para el desarrollo de este trabajo una m´ aquina virtual de dos cores y 8 gb de ram, con Windows 10. Se ha encontrado que una m´ aquina virtual de estas caracter´ ısticas cuesta 26C al mes, y habiendo sido utilizada durante 4 meses nos deja con un coste de 104C a lo largo del proyecto. Una licencia de Vensim DSS de por vida cuesta 1995C. Esta licencia ha sido cedida por el grupo GEEDS para la realizaci´ on del proyecto. Para calcular los costes se ha calculado el coste mensual de la 6CAP´ ITULO 1. OBJETIVOS, CONTEXTO Y PROPUESTA licencia con una amortizaci´ on de 10 a˜ nos, es decir, 199,5C al a˜ no o 16,63C redondeando al mes. Dado que la licencia ha sido cedida por un total de 4 meses, se calcula el coste de la licencia como 66,52. El sueldo medio anual de un ingeniero inform´ atico reci´ en graduado en 2019 ha sido en torno a 21000C. Dividido por las 1950h anuales de trabajo que se realizan se obtiene un coste efectivo de 10,80C cada hora. Multiplicado por las 255 horas que se han dedicado al proyecto obtenemos un coste de mano de obra de 2750C. Sumando estos tres costes obtenemos un coste total para el proyecto de 2924,52C 1.6. Riesgos Los riesgos que se han planteado son: OpenBlas sea incompatible con Vensim. No se pueda lograr una mejora de rendimiento a trav´ es de un DLL externo. El uso de un DLL externo altere de alguna manera el funcionamiento de Vensim, modificando par´ ametros que no deber´ ıa aunque sea de forma m´ ınima. La instalaci´ on de la librer´ ıa es demasiado dif´ ıcil para ser instalada individualmente solo con ayuda del manual de instalaci´ on. Cap´ ıtulo 2 Bibliotecas de ´ algebra matricial. OpenBlas En este cap´ ıtulo se muestran diversas bibliotecas que se han considerado para su uso. Se comparan con respecto a las necesidades de nuestro proyecto y se detalla la elegida. Con respecto a la biblioteca que se va a utilizar se consideran los siguientes par´ ametros de elecci´ on prioritarios desde el punto de vista del desarrollo: Libre disposici´ on, sin limitaci´ on de licencias de uso. Disponible para diversas arquitecturas. Nivel de madurez aceptable. Comunidad de soporte. Que tenga continuidad. En cuanto a sus capacidades de c´ omputo se priorizar´ an las bibliotecas con respecto a estos factores: Velocidad de ejecuci´ on. Consumo de memoria. 2.1. Bibliotecas disponibles La biblioteca necesaria para este proyecto es una que pueda realizar operaciones de ´ algebra lineal sobre matrices. Existe una biblioteca llamada BLAS (Basic Linear Algebra Subprograms) [3] que especifica un conjunto de operaciones con sus implementaciones, y sus rutinas, que son est´ andares y de bajo nivel, se usan en muchos casos como base para crear bibliotecas de operaciones de ´ algebra lineal. Existen bastantes bibliotecas que cumplen este est´ andar BLAS [6], estas son las m´ as relevantes dentro de las que se han tenido en cuenta: 7 8CAP´ ITULO 2. BIBLIOTECAS DE ´ ALGEBRA MATRICIAL. OPENBLAS ATLAS: ATLAS es una biblioteca que implementa las funciones de BLAS de una forma optimizada y es la primera biblioteca cuya instalaci´ on genera c´ odigo optimizado para la m´ aquina en la que est´ a siendo instalada. Sin embargo, la ´ ultima versi´ on estable fue publicada en 2016. LAPACK: LAPACK [4] forma otro est´ andar de funciones de ´ algebra lineal, sin embargo, LAPACK surgi´ o en 1992 como una actualizaci´ on a una biblioteca anterior, LINPACK, que estaba basada en BLAS. A d´ ıa de hoy se sigue actualizando y se usa como otro est´ andar disponible. MKL: Intel oneAPI Math Kernel Library [5] es una biblioteca desarrollada inicialmente por Intel, aunque ahora pertenece a opeAPI. Esta biblioteca no tiene una instalaci´ on muy compleja y tiene muy buen rendimiento en procesadores Intel, sin embargo ofrece tiempos de c´ omputo mucho peores en procesadores AMD. Como la biblioteca no ser´ a instalada en procesadores Intel exclusivamente, se opt´ o por otra opci´ on. OpenBlas: OpenBLAS surgi´ o de una rama de la biblioteca GotoBLAS, la cual es una implementaci´ on de BLAS cuyo desarrollo ces´ o en 2010. Sin embargo, OpenBLAS sigue actualiz´ andose actualmente por el Institute of Software, Chinese Academy of Sciences (ISCAS). OpenBLAS, al igual que ATLAS, ofrece una instalaci´ on que optimiza la biblioteca al hardware en el que est´ a siendo utilizado, y ofrece tanto una implementaci´ on de BLAS como de LAPACK. Adem´ as, ofrece un rendimiento similar a MKL en las funciones pertenecientes a BLAS en procesadores Intel, aunque en las funciones pertenecientes a LAPACK ofrezca un rendimiento peor. [1] En procesadores AMD, ofrece un rendimiento mejor. 2.2. Decisi´ on de OpenBLAS Las razones por las que se ha usado OpenBlas son: OpenBlas es de libre disposici´ on, utiliza una licencia de tipo BSD de 3 cl´ ausulas, que permite el uso y la redistribuci´ on de este software siempre y cuando se incluya el texto asociado a la licencia. Los desarrolladores pretenden lograr que el software funcione lo mejor posible en la mayor cantidad de hardware posible. Al instalarse se optimiza para cada m´ aquina, incluyendo el uso de instrucciones espec´ ıficas para ciertos tipos de hardware. Su instalaci´ on adem´ as deja la biblioteca lista para ser paralelizada. Los desarrolladores trabajan activamente en el proyecto y tiene una comunidad activa que propone mejoras y reporta los bugs, a veces hasta con la soluci´ on propuesta. Est´ a basado en bibliotecas con muchos a˜ nos de historia que han demostrado que sus algoritmos funcionan correctamente y son muy eficientes. 2.3. FORMAS DE INSTALACI ´ ON Y DIFERENCIAS ENTRE ELLAS 9 OpenBLAS est´ a actualmente siendo desarrollado y actualizado, por lo que tambi´ en se optimiza para hardware actual y, previsiblemente, ser´ a actualizado para hardware que vaya saliendo al mercado. Ofrece un rendimiento similar a Intel oneAPI MKL en procesadores Intel, siendo mucho mejor en AMD. 2.3. Formas de instalaci´ on y diferencias entre ellas OpenBlas ofrece varias formas de instalaci´ on, entre las cuales cada una ofrece distintas ventajas, inconvenientes y propiedades. [7] Para su uso con Visual Studio era necesario que la instalaci´ on generase un DLL. Visual Studio no permite usar OpenBlas de otra manera, ya que no permite el uso de instrucciones optimizadas para solo ciertos tipos de procesadores, as´ ı que rechaza el uso del c´ odigo sin compilar. Teniendo en cuenta esto, se descartaron todas las que no generasen un DLL en su instalaci´ on, y se prioriz´ o que la instalaci´ on generase c´ odigo optimizado para la m´ aquina. Visual Studio ofrece su propia forma de instalar OpenBlas, pero no solo no generaba c´ odigo optimizado ya que el mismo no lo admite, sino que adem´ as instalaba una versi´ on parcial de OpenBlas con la que no parec´ ıa funcionar la rama de LAPACK de OpenBlas, que era la que interesaba para la funci´ on de inversi´ on matricial. Adem´ as, esta opci´ on ni est´ a mencionada en la p´ agina de los desarrolladores de OpenBlas ni en ning´ un manual, por lo que los desarrolladores no ofrecen de forma expl´ ıcita ninguna garant´ ıa de que funcione correctamente. De entre las formas que s´ ı est´ an incluidas en el manual que ofrecen los desarrolladores de OpenBlas, tenemos dos opciones que generan un DLL: Instalando por Miniconda3, que parec´ ıa ser la opci´ on principal, o instalando con MinGW [17] que permite usar el compilador GCC en Windows, que en el propio manual explica que es un m´ etodo de instalaci´ on experimental que no ha sido testeado minuciosamente. Sin embargo, OpenBlas fue instalado de ambas maneras con el objetivo de comparar ambas versiones, tanto en dificultad y tiempo de instalaci´ on como en rendimiento en Vensim. No se logr´ o hacer que ninguna de las dos versiones funcionara en Visual Studio y hubo que cambiar de entorno de desarrollo a CodeBlocks. Se profundiza en los problemas espec´ ıficos y en las razones que motivaron a este cambio en el Cap´ ıtulo 3 Debido a ser la ´ unica forma de instalaci´ on que generaba un DLL que funcionase correctamente en un entorno que permitiese generar un DLL para Vensim, la forma de instalaci´ on elegida para su uso en el proyecto es a trav´ es de Miniconda3. 16 CAP´ ITULO 3. PLATAFORMA Y CREACI ´ ON DE DLLS PARA LA PLATAFORMA VENSIM Tras no lograr resolver ni evitar este problema, hubo que cambiar el entorno de desarrollo a uno que s´ ı permitiera la compilaci´ on de archivos DLL que contengan instrucciones exclusivas a cierto hardware. Por suerte, hab´ ıa otro disponible para Windows que permit´ ıa realizar esto mismo porque de lo contrario hubiera sido necesario desarrollar el DLL en Linux y usar compilaci´ on cruzada para obtener el DLL, creando mayores dificultades para el testeo del c´ odigo y m´ as fuentes de posibles errores. 3.5. Soluci´ on planteada: Code::Blocks Code::Blocks es un entorno de desarrollo gratuito de c´ odigo abierto desarrollado por ((The Code:Blocks team)) muy similar a Visual Studio en apariencia y en funcionalidad, pero que permite mucha m´ as libertad debido a que permite el uso de varios compiladores diferentes, el uso de plugins, y m´ as opciones a la hora de decidir c´ omo compilar el c´ odigo. Sin embargo, la ventaja que m´ as relevante resulta para el proyecto es que no tiene ning´ un problema para compilar c´ odigo que contiene instrucciones optimizadas solo para cierto tipo de hardware. 3.6. An´ alisis del c´ odigo presentado por Vensim El c´ odigo dado por Vensim como ejemplo para desarrollar un DLL es un ejemplo autodocumentado que cumple tambi´ en la funci´ on de manual. Sin embargo, sigue siendo un ejemplo autodocumentado, por lo que no todo estaba claro y era necesario entender muchas partes para entender el c´ odigo, por lo que aprender los contenidos de este ejemplo result´ o ser un proceso iterativo que se extendi´ o durante toda la duraci´ on del proyecto. El c´ odigo dado lo podemos dividir en varias secciones: Interfaz del DLL para Vensim Esta secci´ on comprende las funciones que el DLL requiere tener. Cuando se le indica a Vensim a trav´ es de su configuraci´ on que cargue un archivo DLL, Vensim llama a una serie de funciones que han de estar disponibles y bien configuradas para asegurarse de que el DLL es compatible con Vensim y para recibir cierta informaci´ on necesaria. Esta informaci´ on incluye los datos pertinentes a las funciones desarrolladas por el usuario. Dentro del c´ odigo del DLL se ha de tener una estructura de datos creada que Vensim puede leer para saber: El nombre de cada una de las funciones creadas. Las indicaciones que ha de dar al usuario de Vensim acerca de los par´ ametros que la funci´ on recibe. El n´ umero de par´ ametros que recibe la funci´ on. Si la funci´ on devuelve un entero, un vector o una matriz. 3.6. AN ´ ALISIS DEL C ´ ODIGO PRESENTADO POR VENSIM 17 El c´ odigo de funci´ on correspondiente a la funci´ on creada. Si la funci´ on modificar´ a alguno de los par´ ametros dados. Una flag para indicar si la funci´ on devuelve exclusivamente un mensaje de texto o una serie de datos sin recibir par´ ametros o no. Adem´ as, existe una funci´ on llamada vensim external que es a la que Vensim llama cuando ejecuta una funci´ on del DLL. Esta funci´ on tiene dos par´ ametros, el c´ odigo de la funci´ on a la que Vensim ha llamado, una estructura de datos que contiene todos los par´ ametros con los que se ha llamado a la funci´ on del DLL y el n´ umero de par´ ametros pasados. Dentro de esta funci´ on se encuentra un switch que lee el c´ odigo de la operaci´ on, y dentro de este se ha de llamar a la funci´ on correspondiente dentro del DLL. switch(funcid) { case INVERT_FUNC : rval =MATRIXINVERT(val[0].vec, val[1].vec) ; break ; } Cuadro 3.1: Extracto de c´ odigo C del switch de la funci´ on vensim external. En este ejemplo se puede ver que el switch toma como par´ ametro el id de la funci´ on. En el caso de que este par´ ametro sea el correspondiente al id de la funci´ on de inversi´ on matricial, se llama a la funci´ on de inversi´ on matricial interna del DLL. La funci´ on de inversi´ on matricial solo tiene un par´ ametro, la matriz, ya que esta viene dada en una estructura de datos de la que podemos obtener toda la informaci´ on relevante a esta. Sin embargo, Vensim no permite devolver el resultado a trav´ es de un return, sino que para devolver el resultado Vensim a˜ nade un par´ ametro al principio del array de par´ ametros val que se ha de modificar para que tenga los valores que se desean devolver. val es el nombre del array con todos los par´ ametros que recibe el DLL. Este array est´ a compuesto de elementos tipo union, de manera que hay que indicar el tipo del par´ ametro que se est´ a recibiendo. Los principales tipos que puede tomar cada elemento de vec son: val para argumentos de tipo doble. Vensim utiliza siempre dobles, no enteros ni floats, as´ ı que en caso de querer utilizar un entero o un float se ha de utilizar un doble igualmente. Estos se pasan como valor. Vensim llama a este tipo de dobles COMPREAL. vec para vectores o matrices. Estos se pasan por direcci´ on, as´ ı que hay que tener cuidado con modificarlos. Adem´ as, si se modifican sin haber marcado en la declaraci´ on de la funci´ on que se van a modificar argumentos, Vensim se cierra al ejecutar el modelo. literal para cadenas de caracteres. 18 CAP´ ITULO 3. PLATAFORMA Y CREACI ´ ON DE DLLS PARA LA PLATAFORMA VENSIM Gesti´ on de memoria Esta secci´ on comprende ´ unicamente tres funciones, que son las usadas por el DLL para llevar un registro de toda la memoria que se ha reservado para poder limpiarla entre ejecuciones entre modelos. Estas tres funciones son: vext allocate: Esta funci´ on se encarga de la reserva de memoria. vext reallocate: Esta funci´ on se encarga de modificar el tama˜ no de una zona de memoria reservada. vext clearmem: Esta funci´ on borra toda la memoria reservada a trav´ es de las dos anteriores. Se ejecuta autom´ aticamente cuando finaliza la ejecuci´ on de un modelo. Adem´ as existen dos funciones, una que Vensim ejecuta al iniciarse la ejecuci´ on del modelo y otra que ejecuta al finalizarse. Estas funciones son: simulation setup ysimulation shutdown. Hay que asegurarse de inicializar en simulation setup todas las variables est´ aticas globales que se necesiten. simulation shutdown se encarga de llamar a vext clearmem. C´ odigo de usuario Esta secci´ on comprende el resto del c´ odigo desarrollado. Esto incluye tanto a las funciones a las que la funci´ on vensim external llama directamente como a aquellas auxiliares que se usen. 3.7. Casos de prueba Los modelos usados como casos de prueba para la matriz de inversi´ on son tres versiones diferentes del mismo modelo, las cuales se diferencian en el tama˜ no de la matriz que cargan en el sistema. Estos modelos fueron aportados por el grupo GEEDS, quienes ya hab´ ıan intentado resolver este problema y para ello hab´ ıan creado estos modelos. Estos modelos dados consisten en esencia en una carga de una matriz cuadrada de 78.400, 107.584 y 246.016 elementos respectivamente de un Excel, a˜ nadir un factor de aleatoriedad, invertir la matriz y separarla en matrices menores para obtener el formato que usar´ ıan en un proyecto real. Esta secuencia de acciones comprende un ciclo, y cada simulaci´ on de este modelo realiza 3200 de estos ciclos. En el Cuadro 3.2 se indica la relaci´ on de archivos utilizados para la prueba. El nombre del modelo indica el tama˜ no de una de las dimensiones de la matriz cuadrada, y est´ a compuesto de dos n´ umeros que se han de multiplicar para hallar el tama˜ no de esta dimensi´ on. Como es cuadrada, el n´ umero de elementos de la matriz se obtiene hallando el cuadrado del n´ umero de una de sus dimensiones. 3.7. CASOS DE PRUEBA 19 Nombre de archivo : N´ umero de elementos Test35sec8reg.mdl :78,400 Test41sec8reg.mdl :107,584 Test62sec8reg.mdl :246,016 Cuadro 3.2: Correspondencia entre los nombre y el n´ umero de elementos de los casos de prueba. Figura 3.4: Ejemplo de comparaci´ on de los resultados de dos ejecuciones. En la primera columna figura los instantes de ambas matrices (original y STOCK) y en las siguientes los valores en cada instante de tiempo. El mayor problema que tienen estos modelos originales es que al tener un factor de aleatoriedad no se puede comprobar si el DLL devuelve los mismos resultados que devolver´ ıa Vensim, por lo que lo primero que se hizo fue eliminar este factor de aleatoriedad para que todas las ejecuciones devolvieran el mismo resultado. Vensim permite guardar los resultados de las ejecuciones y cargar varios en el programa para compararlos usando la herramienta del programa ((Table)) sobre la variable que almacena los resultados obtenidos de la inversi´ on matricial. Esta herramienta muestra los resultados almacenados en esa variable en cada paso transcurrido en la ejecuci´ on obtenidos en cada una de las ejecuciones cuyos datos se hayan cargado en el programa. Esta figura muestra el resultado de usar la herramienta ((Table)) con dos sets de datos cargados en Vensim sobre el nodo Matrices Leontief Regionales.((STOCK)) es el nombre del resultado de una de las ejecuciones, y es la ejecuci´ on m´ as reciente realizada. El nombre ((STOCK)) es el dado por defecto por el script usado para ejecutar el modelo. Este set de datos se est´ a comparando con el ((Original41x8)), y se puede comprobar que ha devuelto los resultados esperados comparando los valores que toman las casillas por parejas. Este es el m´ etodo 20 CAP´ ITULO 3. PLATAFORMA Y CREACI ´ ON DE DLLS PARA LA PLATAFORMA VENSIM usado para confirmar que el DLL funciona como se espera. Estos datos se cargan en el programa con el uso de la herramienta ((Control Panel)) que te permite cargar los archivos de resultados que se encuentren en la misma carpeta donde est´ e guardado el modelo. Puedes cargar cualquier n´ umero de ejecuciones, incluso cero, pero no ha sido necesario nunca cargar m´ as de dos. Figura 3.5: Resultado de abrir la herramienta ((Control Panel)) en uno de los modelos En esta figura se puede observar el resultado de abrir la herramienta ((Control Panel)). Hay dos columnas, en la de la izquierda se muestran los archivos con datos detectados en la carpeta del modelo y a la derecha los datos cargados en el programa. Como se puede ver, est´ an cargados en Vensim los sets de datos llamados ((STOCK)) y((Original41x8)) Adem´ as, se us´ o un peque˜ no script dado tambi´ en por el grupo GEEDS para guardar la cantidad de tiempo que tarda una simulaci´ on en completarse. Este script almacena en un archivo de texto la hora en la que empez´ o finaliz´ o la ejecuci´ on, junto a los minutos y los segundos. Teniendo esto en cuenta, ya se dispon´ ıan de herramientas para comprobar que el DLL devolv´ ıa los resultados esperados y la diferencia de tiempo entre usar el DLL y no usarlo. 3.8. Descripci´ on del prototipo 1 El primer prototipo es sencillo y consiste en adaptar el ejemplo dado por Vensim a c´ odigo que pueda ser compilado por Code::Blocks y cuyo DLL resultante pudiera ser le´ ıdo y ejecutado por Vensim. 3.9. PRUEBAS REALIZADAS 21 Para esto hubo principalmente que modificar el nombre y los includes de varios de los archivos para que coincidan con el ´ arbol de directorios. Este prototipo form´ o la base para prototipos posteriores 3.9. Pruebas realizadas Se realizaron dos pruebas sencillas para comprobar el correcto funcionamiento de este prototipo. La primera consiste en cargar el DLL obtenido en Vensim y que este lo cargue sin errores, y que adem´ as lo cargue autom´ aticamente cada vez que se abre el programa. Esta prueba nos indica tanto que se han corregido todos los errores del ejemplo dado por Vensim como que no hay problemas en las funciones pertinentes a la comunicaci´ on inicial de Vensim. Adem´ as, para comprobar si el DLL ha sido cargado correctamente, se abre el men´ u desplegable que enumera las funciones que a˜ nade este DLL, por lo que al ver que la lista de funciones mostradas es correcta, se comprueba que la comunicaci´ on inicial entre el DLL y Vensim ha sucedido como se esperaba. La segunda prueba comprende sustituir en un ejemplo la funci´ on de inversi´ on de matrices de Vensim por la cargada en el DLL de ejemplo de Vensim y comprobar que, pese a que como se esperaba tarda m´ as tiempo, los resultados obtenidos en la simulaci´ on son los esperados, id´ enticos a los originales. 22 CAP´ ITULO 3. PLATAFORMA Y CREACI ´ ON DE DLLS PARA LA PLATAFORMA VENSIM Cap´ ıtulo 4 Integraci´ on de Vensim y OpenBlas 4.1. Soluci´ on adoptada A la hora de elegir las versiones del software a utilizar se eligieron las m´ as nuevas disponibles en el momento. Las versiones utilizadas han sido: Code::Blocks versi´ on 20.03mingw [15] OpenBlas versi´ on 3.15 [9] Miniconda 3 versi´ on Python 3.9 [16] Visual Studio versi´ on 2019 [14] Vensim versi´ on DSS 8.2.1. Debido a que OpenBlas se compila como una biblioteca de 64 bits, el dll creado se compila como una biblioteca de 64 bits tambi´ en, por lo que se requiere de Vensim 8 o superior para poder ser usada ya que es la versi´ on a partir de la cual se pueden cargar en Vensim bibliotecas de 64 bits. Tambi´ en es posible que versiones posteriores a la 8 incluyan elementos que hagan que el DLL sea incompatible. Por suerte cada nueva versi´ on de Vensim DSS trae la versi´ on actualizada del DLL de ejemplo y solo deber´ ıa de hacer falta sustitu´ ır ciertos archivos por otros nuevos, sin modificar el c´ odigo en el archivo venext.c donde se incluye todo el c´ odigo escrito en este trabajo. El directorio por defecto donde se puede encontrar el ejemplo del c´ odigo del DLL tras instalar Vensim es: C:\Users\Public\Vensim\COMP\VensimExternalFunctionLibrary\Windows\VensimExternalFunctionLibrary 4.2. An´ alisis inicial de rendimiento Para el an´ alisis de rendimiento se usaron los casos de prueba explicados en el Cap´ ıtulo (). Como las ejecuciones resultaron tardar entre 5 y 20 minutos y el tiempo de ejecuci´ on var´ ıa bastante dependiendo de la m´ aquina en la 23 24 CAP´ ITULO 4. INTEGRACI ´ ON DE VENSIM Y OPENBLAS que se ejecute, se busc´ o obtener una referencia de tiempo meramente orientativa, por lo que se ejecut´ o cada caso de prueba 3 veces para realizar la media. Estas medidas se tomaron de una ejecuci´ on en una m´ aquina virtual con dos cores disponibles. M´ as adelante se tomar´ ıan medidas de la misma manera de Vensim usando el DLL para comprobar si existe una mejor´ ıa de tiempo y qu´ e nivel de mejora se puede esperar en los modelos utilizados. Tama˜ no N´ umero de Orden de Tiempo de de fila elementos ejecuci´ on ejecuci´ on media 1º 265s 35x8 78400 2º 262s264s 3º 266s 1º 402s 41x8 107584 2º 392s397s 3º 399s 1º 1267s 62x8 246016 2º 1222s1249s 3º 1258s Cuadro 4.1: Medidas de referencia obtenidas al ejecutar 3 veces cada caso de prueba con Vensim sin DLL. Estos contienen matrices de diferentes tama˜ nos indicados en ((N´ umero de elementos)) 4.2.1. Descripci´ on del prototipo 2 Este prototipo consiste en una terminal que muestre los resultados de realizar una operaci´ on de OpenBlas sobre una matriz peque˜ na. El objetivo de este prototipo es obtener un entorno de pruebas para lograr entender bien c´ omo operar usando OpenBlas y poder comprobar de forma r´ apida y directa que funciona correctamente. M´ as adelante, en caso de tener dudas acerca de si se est´ a llamando adecuadamente a una funci´ on o se desea realizar pruebas acerca de modificar una variable de la funci´ on se usar´ a este prototipo para comprobar que tal funci´ on nueva a incorporar en el c´ odigo del DLL funciona como se espera que haga. Como la primera operaci´ on que se desea realizar usando OpenBlas es la inversi´ on matricial, esta es la operaci´ on que usar´ a este prototipo. Para realizar esta operaci´ on, se requiere de la llamada de dos funciones de OpenBlas. Este prototipo tiene una matriz cuyos valores se establecen en el c´ odigo, una llamada a una funci´ on en la que se opera sobre esta matriz y una creaci´ on de una terminal sobre la cual se representan los valores finales que tiene esta matriz al acabar la ejecuci´ on del programa. 4.2.2. Pruebas realizadas La prueba realizada sobre este prototipo es establecer una matriz de 5x5 con valores no aleatorios y contrastar que los valores mostrados en la terminal corresponden con los obtenidos realizando la inversi´ on de la misma matriz usando Wolfram Alpha. Esta prueba se realiz´ o tres veces con valores diferentes de la matriz inicial. Cap´ ıtulo 5 An´ alisis y Dise˜ no de la biblioteca presentada En este cap´ ıtulo se explica el funcionamiento y el desarrollo de las funciones desde el an´ alisis de los requisitos de estas funciones hasta el desarrollo y las pruebas realizadas. 5.1. Requisitos de la interfaz de programaci´ on. Casos de uso Para simplificar el uso de las funciones externas, se propuso como objetivo que la llamada a la funci´ on y su resultado se acercaran lo m´ aximo posible a c´ omo se utilizan funciones similares en Vensim. Adem´ as, al utilizar una funci´ on Vensim te permite mostrar cu´ antos par´ ametros le has de pasar a esta junto a el nombre que tiene cada uno. Estaba planeado desarrollar dos funciones que supusieran una mejora directa respecto a funciones similares de Vensim: Inversi´ on matricial y la operaci´ on SUM. La funci´ on de inversi´ on matricial realiza, como su propio nombre indica, la inversi´ on de una matriz. La versi´ on de Vensim llamada INVERT MATRIX recibe dos argumentos: la matriz y su tama˜ no. Sin embargo como Vensim ya le pasa esa informaci´ on al DLL por medio de la estructura de datos que encapsula a la matriz pasada como argumento, la funci´ on desarrollada en el DLL solo tendr´ a un par´ ametro, la matriz. Y para conservar un nombre similar, su nombre es MATRIXINVERT. La funci´ on SUM tiene un funcionamiento muy complejo en Vensim que es imposible de reproducir a trav´ es de un DLL de funciones externas. Sin embargo, el uso que exige la mayor cantidad de tiempo en los modelos del grupo GEEDS es bastante concreto. Juntan varias matrices creando una matriz enorme de muchas dimensiones y quieren sumar los datos por filas, columnas u otras dimensiones. Adem´ as, se plane´ o crear una funci´ on para a˜ nadir una matriz al espacio de memoria del DLL, de manera que esta funci´ on llamada ADDMATRIX toma como argumento una matriz y un nombre para esta y la guarda en la memoria del DLL. Esto es complementario a una funci´ on para recuperar esa matriz del espacio de memoria del DLL llamada GETMATRIX que solo toma como argumento el nombre de la matriz que se quiere recuperar y devuelve la matriz en cuesti´ on. 25 32 CAP´ ITULO 5. AN ´ ALISIS Y DISE ˜ NO DE LA BIBLIOTECA PRESENTADA Vensim al finalizar la ejecuci´ on de cada modelo ejecuta un free() a todos los objetos que han sido reservados a trav´ es de las funciones de reserva de memoria dadas por el DLL cuando llama la funci´ on vext clearmem. Si no se utiliza la funci´ on freeSimpleMat para liberar memoria, la memoria que usa Vensim crece constantemente hasta saturar la memoria disponible, sin embargo si se utiliza, al finalizar la ejecuci´ on del modelo en la llamada a vext clearmem se ejecuta free() sobre memoria ya liberada y crashea antes de guardar los datos. Esto lleva al intento de que getSimpleMat reserve la memoria necesaria a trav´ es de malloc. Sin embargo, por razones que no he llegado a descubrir parece que al reservar memoria directamente luego Vensim tiene problemas al escribir los datos de la simulaci´ on en el archivo y se corrompen o crashea en el intento. 5.6. Pruebas realizadas Las ´ unicas pruebas realizadas exitosamente son las del uso de getQuickSimpleMat, funci´ on a la que se llama antes de llamar a la nueva INTERNALMATRIXINVERT. Todas las dem´ as han producido errores que se han ido mencionando en la explicaci´ on del desarrollo del prototipo. 5.7. Descripci´ on del prototipo 5 El prototipo 5 consiste en adaptar la funci´ on SUM de Vensim a una m´ as eficiente pero m´ as limitada. Esto se debe principalmente a que la funci´ on SUM es de las m´ as vers´ atiles y completas que ofrece Vensim. El uso que se le da en los proyectos que ocupa la segunda mayor cantidad de tiempo despu´ es de la inversi´ on matricial es uno muy concreto: sumar todos los elementos de una dimensi´ on de una matriz reduciendo su n´ umero de dimensiones. Las dimensiones que quieren reducir pueden ser una o varias e incluso intercaladas. Debido a que OpenBlas no viene con una funci´ on que realice esta operaci´ on concreta directamente, existen dos maneras de abordar el problema: Crear un algoritmo que limite que las dimensiones solo puedan ser colapsadas empezando desde la que est´ a m´ as a la derecha. Esto limitar´ a al programador de los modelos de Vensim a acceder a la matriz de forma ´ optima, y es sencillo crear un algoritmo eficiente que realice la suma con un solo recorrido de la matriz. Esta limitaci´ on parece ser posible implementarla en los proyectos seg´ un conversaciones con integrantes de GEEDS, ya que esas matrices multidimensionales las crean ellos juntando muchas otras matrices m´ as peque˜ nas. Se espera que al obligar a operar al usuario de Vensim a realizar esta operaci´ on de forma que los accesos de memoria sean eficientes y se pueda realizar un ´ unico recorrido de la matriz pueda ahorrar tiempo. Crear una funci´ on que realice una multiplicaci´ on matricial entre la matriz original y otra de dimensiones iguales pero cuyos elementos sean unos y ceros para obtener utilizando OpenBlas los resultados que deseamos pero de forma descolocada. Esto permitiria mantener la libertad de colapsar dimensiones de forma intercalada y utilizando OpenBlas se obtendr´ ıa un muy buen rendimiento en la operaci´ on, sin embargo asegurarse de que funcione para cualquier combinaci´ on de dimensiones originales y a colapsar tal y como funciona en Vensim llevar´ ıa mucho tiempo de programar. Como a estas alturas del proyecto ya se dispon´ ıa de una cantidad limitada de tiempo, se opt´ o por realizar la primera opci´ on. 5.8. PRUEBAS REALIZADAS 33 5.8. Pruebas realizadas Tal y como se ha explicado en el la Secci´ on 5.4 no he alcanzado un nivel suficiente en modelado en Vensim, por lo que no he podido crear casos de prueba para usar con la funci´ on SUM desarrollada. Adem´ as, esta funci´ on tiene un problema adicional y es que la matriz que se recibe y la que se devuelve no tienen las mismas dimensiones, y es posible que esto pueda impedir la existencia de una sola versi´ on de la funci´ on SUM, sino que haya que crear una versi´ on para cada n´ umero de dimensiones que pueden ser devueltas (entre 1 y 7 dado que Vensim parece tener un l´ ımite de 8 dimensiones para las matrices). Esto se debe a la existencia de una variable llamada num loop que modifica la cantidad de las constantes de Vensim llamadas subscripts y es posible que esta variable obligue a que la funci´ on no pueda modificar el n´ umero de dimensiones de la matriz que puede devolver, es decir, que si est´ a programada para devolver matrices de 3 dimensiones solo puede devolver matrices de 3 dimensiones. Sin embargo es posible que si se programa la funci´ on para devolver matrices de 8 dimensiones se puedan devolver matrices de hasta 8 dimensiones ya que es el modelo de Vensim quien indica el n´ umero de dimensiones que tendr´ a la matriz de retorno. 34 CAP´ ITULO 5. AN ´ ALISIS Y DISE ˜ NO DE LA BIBLIOTECA PRESENTADA Cap´ ıtulo 6 Conclusiones y trabajo futuro 6.1. Conclusiones El objetivo principal de este proyecto, acelerar la inversi´ on matricial en Vensim, ha sido cumplido con ´ exito. Tras el desarrollo de este trabajo se ha obtenido un DLL compilado que permite acelerar la operaci´ on de inversi´ on matricial sobre todo para los casos m´ as relevantes que son las matrices de gran tama˜ no y se ha obtenido tambi´ en un manual de instalaci´ on de este DLL junto a OpenBlas. Adem´ as, se ha investigado mucho acerca de librer´ ıas de ´ algebra lineal, de entornos de desarrollo para DLLs para Vensim y del funcionamiento del propio Vensim, y los resultados de esta investigaci´ on est´ an presentes en esta memoria. A partir de esos resultados obtenidos mas las bases creadas para ambos objetivos que no se han llegado a cumplir se puede extender este trabajo para cumplir con los objetivos que faltan y muchos otros que se mencionan m´ as adelante. En resumen, los objetivos cumplidos completamente han sido: Realizar un estudio de las librer´ ıas disponibles que permitan realizar ese tipo de c´ alculos. Realizar un estudio de la tecnolog´ ıa disponible para la creaci´ on de DLLs. Crear un DLL que permita a˜ nadir funciones externas a Vensim. Desarrollar una funci´ on externa que permita realizar la operaci´ on de inversi´ on matricial en menor tiempo que Vensim para matrices grandes. Redactar un manual de instalaci´ on para la librer´ ıa de c´ alculo utilizada. Redactar un manual de uso de las funciones externas creadas. Y los objetivos que no se han completado han sido: Crear una serie de funciones dentro del DLL que permitan almacenar matrices dentro del espacio de memoria del DLL. Desarrollar una funci´ on externa que permita colapsar dimensiones de una matriz en menor tiempo que Vensim para matrices grandes. 35 36 CAP´ ITULO 6. CONCLUSIONES Y TRABAJO FUTURO 6.2. Seguimiento del plan Las predicciones del tiempo que llevar´ ıa realizar cada uno de los prototipos result´ o ser no muy alejada de la realidad, obteniendo las siguientes diferencias de tiempo: Prototipo Tiempo previsto Tiempo utilizado Diferencia de tiempo Primero 2 semanas 3 semanas +1 semana Segundo 3 semanas 3 semanas +0 semanas Tercero 3 semanas 4 semanas +1 semana Manuales 1 semana 2 semanas +1 semana Cuarto 2 semanas 4 semanas +2 semanas Quinto 2 semanas 1 semana -1 semana Total 13 semanas 17 semanas +4 semanas Cuadro 6.1: Comparaci´ on del tiempo previsto con el tiempo utilizado en el desarrollo. Se ten´ ıa de tiempo para realizar el trabajo entre tres y cuatro meses, cosa que ha hecho que no se pudiera finalizar totalmente los dos ´ ultimos prototipos. Sin embargo, los objetivos principales que eran optimizar la inversi´ on matricial y crear los manuales de instalaci´ on y de uso han sido completados exitosamente. Esta operaci´ on es la que m´ as tiempo requer´ ıa y la que preve´ ıan que iba a necesitar cada vez m´ as tiempo, por lo que empezaban a necesitar en GEEDS urgentemente optimizar esta operaci´ on de inversi´ on matricial. Sin embargo esto significa que no se ha logrado cumplir con todos los objetivos propuestos al inicio del trabajo, concretamente los relacionados con la creaci´ on del cuarto y quinto prototipo, de los cuales solo se ha logrado una compleci´ on parcial. Adem´ as, se han dejado asentadas unas buenas bases para poder realizar mejoras a este DLL en un futuro. 6.3. Trabajo futuro Existen muchas posibilidades para futuros avances y optimizaciones en este proyecto. Entre las m´ as destacables se encuentran: Como se ha mencionado en el Cap´ ıtulo 3, en el prototipo 3 se menciona que existe la opci´ on de llamar a una funci´ on de OpenBlas para averiguar la mejor cantidad de memoria que reservar para el vector auxiliar de datos. Esta operaci´ on tiene un coste de tiempo, sin embargo, en caso de que este vector auxiliar sea demasiado grande, la operaci´ on tambi´ en tardar´ a m´ as. Es posible que exista una relaci´ on entre el tama˜ no de la matriz grande para la cual est´ a optimizado el tama˜ no del vector y una matriz mucho menor que use la funci´ on a partir de la cual se ahorre tiempo al llamar a la funci´ on de averiguar el tama˜ no ´ optimo del vector antes de comenzar a operar. Como se explic´ o tambi´ en, no har´ ıa falta cambiar el tama˜ no del vector, solo indicarle a OpenBlas que hay menos memoria reservada para el vector de la que en realidad hay. Crear m´ as casos de prueba para la funci´ on MATRIXINVERT para poder estudiar c´ omo evoluciona la mejora del tiempo con matrices m´ as grandes. 6.3. TRABAJO FUTURO 37 Crear y depurar la funci´ on SUM Desarrollar la otra posibilidad de la funci´ on SUM para averiguar cu´ al funciona mejor. Buscar una soluci´ on a los problemas de memoria que se generan al intentar almacenar matrices y borrarlas. Crear una soluci´ on que permita a funciones recibir ambos tipos de SimpleMat, pero que permita a otros restringir cu´ al de los dos tipos recibe, de manera que no se puedan crear errores en el c´ odigo debido a utilizar un tipo de SimpleMat en una operaci´ on que haga que falle. Implementar m´ as operaciones en el DLL que comprendan una gran parte de las ejecuciones de los modelos creados para el proyecto LOCOMOTION. 38 CAP´ ITULO 6. CONCLUSIONES Y TRABAJO FUTURO Ap´ endice A Gu´ ıa de instalaci´ on (Esta gu´ ıa se presenta en la p´ agina siguiente por razones del editor de texto). 39 MyFunction OpenBlas Visual Studio Miniconda3 Manual for the Installation of OpenBlas and Custom Functions for Vensim  Manual for the Installation of OpenBlas and Custom Functions for Vensim Introduction: Miniconda 3 installation: Microsoft Visual Studio installation: OpenBlas installation: Dependencies list and location: Load into Vensim: Uninstallation: How to update the custom functions library: Introduction: OpenBlas is a library made for optimizing the execution of mathematical operations, mainly matrix related ones. Its installation in a specific hardware configures the library so that it uses hardware specific optimizations, including parallel processing and certain CPU exclusive operations among many other minute optimizations. This lets us execute complex mathematical operations faster than Vensim can, mainly because Vensim only uses one CPU core while OpenBlas can use more cores, as long as they are available, and use them more efficiently. OpenBlas is used by the library that Vensim loads our custom functions from, and thus, it is necessary in order for it to function properly, among other dependencies OpenBlas requires. These dependencies are listed in this manual and they are part of the software used to install OpenBlas. Since OpenBlas is a x64 library, this library is x64 too, so Vensim 8 or newer is required to use the custom functions. In order to install OpenBlas, you need to install other software before, which are Miniconda 3 and any version of Microsoft Visual Studio 2015 or newer, having installed the desktop development with c++ package. This guide will cover how to install these programs too.  Miniconda 3 is a terminal that will be used to download some of the libraries OpenBlas uses and to ensure it gets installed in the correct environment. Microsoft Visual Studio needs to be installed so that we can use some of its files for the installation. There is no need to sign in, just having it installed is enough. The steps we will be following can be found on the official OpenBlas installation guide for windows, in the first section ( 1. Native (MVSC) ABI ). However, you need to pay extra attention to certain steps in order to be able to use OpenBlas in Vensim, specifically the directories you decide to install the software in. The list of the dependencies and a command that opens a file from Visual Studio will assume that you have installed the software in the default directory. This guide also includes the commands to install Miniconda and Visual Studio through chocolatey in case you want to do so. This is completely optional.   Miniconda 3 installation: Miniconda can be downloaded from this link, scrolling down until you get to the section "Latest Miniconda Installer Links". The version used in the making of the library is the one for python 3.9, 64 bits. However, any version should work as long as it is 64 bits. Older version links are below the "Latest Miniconda Installer Links" section, grouped by OS. The installation is really straightforward, follow the instructions from the installer. However, it is really important that you note the directory you install Miniconda in. You may need to run the installer as an administrator. You can also install it through chocolatey with the command: choco install miniconda3  Microsoft Visual Studio installation: Microsoft Visual Studio can be downloaded from microsoft’s page. The recommended version to install is 2019, but any newer than 2015 included should work. Follow the steps of the installer. However, when prompted to select the packages to install, be sure to have "desktop development with c++" selected before continuing. There usually are three options for downloading any version of Visual Studio: Community, Professional and Enterprise. The Community version is free and has everything we need for the installation. In case you already had Visual Studio installed but without the package, you can just run the installer again, click modify and you will be directed to the package selection screen, where you can add new packages. Select and install the desktop development with c++ if that is the case. You can also install the base Visual Studio with the command choco install visualstudio2019community , then the package with choco install visualstudio2019workload-nativedesktop .  48 AP ´ ENDICE C. GU´ IA DE INSTALACI ´ ON Y USO DE LA PLATAFORMA DE DESARROLLO Ap´ endice D Repositorios de documentaci´ on y software El c´ odigo fuente junto al manual y el dll compilado se pueden encontrar en: https://github.com/AManteola/funciones-externas-vensim 49 50 AP ´ ENDICE D. REPOSITORIOS DE DOCUMENTACI ´ ON Y SOFTWARE Ap´ endice E Licencia de uso de OpenBlas Copyright (c) 2011-2015, The OpenBLAS Project All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the name of the OpenBLAS project nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS .AS IS.AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OPENBLAS PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 51 52 AP ´ ENDICE E. LICENCIA DE USO DE OPENBLAS Bibliograf´ ıa [1] Performance Comparison of OpenBLAS* and Intel® Math Kernel Library, SOFTWARE.INTEL.COM. Recuperado 15/09/2021, de https://software.intel.com/content/www/us/en/develop/articles/ performance-comparison-of-openblas-and-intel-math-kernel-library-in-r. html [2] Vensim Software, VENSIM.COM. Recuperado 15/09/2021, de https://vensim.com/vensim-software/ [3] Basic Linear Algebra Subprograms, WIKIPEDIA.ORG. Recuperado 15/09/2021, de https://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms [4] Linear Algebra Package, WIKIPEDIA.ORG. Recuperado 15/09/2021, de https://en.wikipedia.org/wiki/LAPACK [5] Intel oneAPI Math Kernel Library, INTEL.COM. Recuperado 15/09/2021, de https://software.intel.com/content/www/us/en/develop/tools/oneapi/ components/onemkl.html#gs.binq1p [6] Comparison of Linear Algebra Libraries, WIKIPEDIA.ORG. Recuperado 15/09/2021, de https://en.wikipedia.org/wiki/Comparison_of_linear_algebra_libraries [7] Venisim manual for external functions, VENSIM.COM. Recuperado 15/09/2021, de https://www.vensim.com/documentation/dss_external_fn.html [8] Vensim Online Documentation, VENSIM.COM. Recuperado 15/09/2021, de https://www.vensim.com/documentation/index.html 53 54 BIBLIOGRAF´ IA [9] OpenBlas installation for Windows, GITHUB.COM/XIANYI. Recuperado 15/09/2021, de https://github.com/xianyi/OpenBLAS/wiki/How-to-use-OpenBLAS-in-Microsoft-Visual-Studio [10] The LAPACKE C Interface to LAPACK, NETLIB.ORG. Recuperado 15/09/2021, de https://www.netlib.org/lapack/lapacke.html [11] GEEDS homepage, GEEDS.ES. Recuperado 15/09/2021, de https://geeds.es [12] LOCOMOTION homepage, LOCOMOTION-H2020.EU. Recuperado 15/09/2021, de https://www.locomotion-h2020.eu [13] MEDEAS homepage, MEDEAS.EU. Recuperado 15/09/2021, de https://www.medeas.eu [14] Visual Studio, MICROSOFT.COM. Recuperado 15/09/2021, de https://visualstudio.microsoft.com [15] Code::Blocks, CODEBLOCKS.ORG. Recuperado 15/09/2021, de https://www.codeblocks.org/downloads/binaries/ [16] Miniconda3, CONDA.IO. Recuperado 15/09/2021, de https://docs.conda.io/en/latest/miniconda.html [17] MinGW, MINGW-64. Recuperado 15/09/2021, de https://www.mingw-w64.org