Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Resumen
HPC Services for Excel admite una variedad de nuevos modelos de programación que permiten ejecutar cálculos de Excel en un clúster de HPC. En este artículo se describe cómo usar macros de VBA de Excel para compilar libros que usan un clúster de HPC para ejecutar cálculos en paralelo. Para admitir HPC Services para Excel, el libro debe incluir un conjunto de macros que implementan las funciones asincrónicas. En este artículo se describe el marco de macros y cómo definir cálculos dentro del marco de trabajo. En este artículo se incluye un ejemplo de cómo crear un libro desde cero y un ejemplo de conversión de un libro existente para que se ejecute en un clúster.
Introducción
¿Dedicaría una hora a que el libro de Excel se ejecutara cuatro veces más rápido? ¿Qué tal ocho veces más rápido, o incluso más? Si tiene libros de Excel de larga duración o lentos, puede usar HPC Services for Excel con un clúster de Microsoft HPC para mejorar considerablemente el rendimiento del cálculo.
HPC Services for Excel admite una variedad de nuevos modelos de programación que le permiten ejecutar cálculos de Excel en un clúster de HPC. Pero no es necesario comprender el desarrollo de código ni conocer C#, para usar HPC Services para Excel. En este artículo se describe cómo compilar libros que usan un clúster de HPC para el cálculo, usando solo VBA de Excel.
En realidad, probablemente tardará más de una hora en convertir uno de los libros para ejecutarse en el clúster, en función de la complejidad del libro. Pero si dedica una hora a trabajar en los ejemplos de este artículo, comprenderá los conceptos implicados y los requisitos para convertir solo un libro que se ejecute en un clúster de HPC. También verá las ventajas de rendimiento que puede obtener con algunos cambios sencillos en el código VBA.
Audiencia prevista
Este artículo está destinado a desarrolladores de Excel que están familiarizados con la escritura de macros de VBA. La familiaridad con Microsoft HPC Pack es útil, pero no es necesaria.
Si está interesado en las posibilidades de rendimiento de HPC Services para Excel, pero no desea recorrer el proceso de desarrollo completo, los archivos de descarga incluyen versiones completadas de los dos libros que se describen en este artículo. Si quiere intentar ejecutar estos libros en un clúster de MICROSOFT HPC, lea la sección "Antes de empezar" para asegurarse de que tiene todos los requisitos establecidos antes de empezar. Para obtener ejemplos y documentación adicionales, vaya a https://github.com/Azure-Samples/hpcpack-samples.
Descargar archivos
Puede encontrar algunos archivos de ejemplo que se usan en las secciones siguientes del repositorio de Github de ejemplo de HPC Pack. Los archivos de ejemplo incluyen archivos de macro de esqueleto que puede importar en los libros para simplificar el proceso de desarrollo. También hay un libro básico que usaremos como punto de partida para desarrollar un libro para HPC Services para Excel.
Estructura y formato
Las capturas de pantalla de este artículo proceden de Excel y del Administrador de clústeres de HPC. En los ejemplos prácticos incluidos en este artículo, los ejemplos de código usan un estilo de código que representa el editor de VBA:
'==========================================================
'
' Section 1: Variables and constants
'
'==========================================================
Dim SentRecords As Integer
Dim RcvRecords As Integer
Cuando se agreguen o modifiquen líneas de código, se resaltarán en verde. Gran parte del código incluido aquí se importa a partir de archivos existentes o se copia entre archivos VBA diferentes. En ese caso, se pueden truncar algunas líneas largas de código para ajustarse a los márgenes de este documento. Intente copiar y pegar documentos existentes en lugar de hacerlo en este artículo para evitar incluir accidentalmente los ejemplos de código truncados.
Información general
HPC Services for Excel admite una serie de modelos de programación para desarrollar y ejecutar cálculos de Excel en un clúster de Microsoft HPC. La solución que seleccione debe depender de sus necesidades específicas y sus aptitudes de desarrollo.
Uso previsto | Aptitudes necesarias | Solución |
---|---|---|
Calcular libros en paralelo, para mejorar el rendimiento (tiempos de cálculo más rápidos) o la capacidad de procesar más datos en la misma cantidad de tiempo | Desarrollo de VBA (macro) de Excel | Ejecución de libros en un clúster de HPC con VBA de Excel |
Creación de aplicaciones y servicios personalizados que ejecutan libros de Excel en un clúster de HPC e integración con aplicaciones independientes o scripts por lotes | Programación de .NET con C#, VBA.NET o cualquier lenguaje compatible con .NET CLR | Desarrollo de servicios hpC personalizados y aplicaciones cliente para Excel |
Aceleración del cálculo de funciones de Excel User-Defined (UDF) contenidas en bibliotecas de extensiones de Excel (XLL) | Programación de C o C++, desarrollo de la biblioteca de extensiones de Excel (XLL) | Funciones de User-Defined de Excel Cluster-Enabled |
Abordaremos cada uno de estos modelos de programación en artículos futuros. En la actualidad, abordaremos el primer modelo: calcular libros de Excel en paralelo con solo Excel VBA. Incluso si desea avanzar hacia un desarrollo más complejo con Excel y Microsoft HPC Pack, este puede ser un excelente punto de partida: es la manera más sencilla y rápida de obtener aplicaciones de Excel que se ejecutan en un clúster de HPC, y le ayudará a comprender los requisitos y ventajas del uso de SERVICIOS HPC para Excel.
Para admitir desarrolladores de Excel, HPC Services for Excel incluye un conjunto de bibliotecas que puede usar directamente desde Excel (en el escritorio) para compilar y ejecutar libros de Excel en un clúster de Microsoft HPC. Con estas bibliotecas, no es necesario conocer la programación de .NET ni C#. Todo el trabajo se puede realizar desde Excel escribiendo macros de VBA. Con este marco, puede acelerar drásticamente el cálculo de libros de Excel simplemente escribiendo código VBA y ejecutando los libros en el clúster.
HPC Services for Excel incluye un marco de servicio o cliente diseñado específicamente para usarse desde Excel en el escritorio. Hay dos partes importantes para este marco: una biblioteca cliente, que se instala en el escritorio; y una biblioteca de servicios, que se instala en los nodos de proceso del clúster. Estas bibliotecas se instalan de forma predeterminada al instalar Microsoft HPC Pack, por lo que no tendrá que realizar ninguna configuración personalizada para usarlas.
Una vez instalada la biblioteca de servicios y el cliente, puede compilar y ejecutar libros de Excel para el clúster simplemente agregando algunas macros de VBA al libro. Describiremos estas nuevas macros de VBA como marco de macros. Cuando se hace referencia al marco de macros, se describen específicamente las nuevas macros que se agregan a los libros para admitir el cálculo en un clúster de HPC.
Antes de analizar las macros específicas, merece la pena resaltar algunos conceptos clave que afectan a cómo se construyen las macros y cómo funcionan.
Cálculo asincrónico
El concepto más importante para comprender en el desarrollo de libros para HPC Services para Excel y el uso del marco de macros es el cálculo asincrónico.
Una aplicación típica de Excel se ejecuta de forma sincrónica. Es decir, se presiona un botón para ejecutar una macro y la macro ejecuta algún código VBA. Dentro de este código, puede realizar cambios en la hoja de cálculo, llamar a otras funciones de VBA, acceder a bases de datos o cualquier otra cosa. Pero espera que las macros se ejecuten de principio a fin y, a continuación, se completen.
El modelo asincrónico es un poco diferente. En este modelo, escribirá funciones de VBA, pero no las llamará directamente. En su lugar, una biblioteca cliente (código instalado con HPC Services para Excel) llamará a las funciones de VBA.
Si está familiarizado con los eventos de Excel en VBA, ya conoce este modelo. Por ejemplo, si escribe una función VBA que se ejecuta en el evento Workbook.Open, sabe que el código se ejecutará cada vez que se abra el libro. Pero no llamas directamente a ese código; en su lugar, Excel llama a la función que escribe automáticamente cuando se abre el libro.
El modelo de programación asincrónica funciona de la misma manera. Puede escribir funciones a las que se llamará durante un cálculo, pero en lugar de llamarlas usted mismo, esperará a Excel (o, en este caso, la biblioteca hpC Services para Excel) para llamar a las funciones.
Cálculo iterativo y cálculo paralelo
Otro concepto importante es el cálculo iterativo. El cálculo iterativo hace referencia a un tipo de cálculo que ejecuta los mismos pasos de cálculo básicos en diferentes conjuntos de datos.
El ejemplo más común de cálculo iterativo es la simulación de Monte Carlo. En una simulación de Monte Carlo normalmente tiene un cálculo complejo ,como la generación de precios de valores, en función de algún valor de entrada aleatorio, como el retorno esperado durante varios años. Una simulación de Monte Carlo ejecuta el mismo cálculo miles de veces, cada vez con un valor de entrada aleatorio diferente.
Se trata de un cálculo iterativo porque cada vez que se calcula el precio, con un valor de entrada aleatorio diferente, se vuelve a ejecutar todo el cálculo. Estos cálculos son independientes; es decir, en cada cálculo individual no hay ninguna referencia a ningún cálculo anterior o posterior.
Otro ejemplo común implica ejecutar un cálculo sobre un conjunto de registros de una base de datos. En este caso, es posible que tenga un cálculo complejo ,como un modelo de seguro o actuarial, que se basa en algunos parámetros, como la edad y el sexo de un titular de la póliza de seguro. El cálculo iterativo ejecutará el mismo modelo para miles de titulares de directivas individuales. Cada cálculo es independiente de todos los demás cálculos.
El marco de macro que se describe aquí está diseñado para trabajar con estos tipos de cálculos iterativos. Esto es importante porque cuando se ejecuta un cálculo en un clúster de HPC, vamos a ejecutar el cálculo en paralelo , ejecutaremos el mismo cálculo muchas veces, pero ejecutaremos varias instancias del cálculo al mismo tiempo en los nodos de proceso del clúster.
Si el cálculo no fuera independiente ,si los resultados de cualquier cálculo único dependían de los cálculos anteriores que se hubieran ejecutado, esto no funcionaría. Por lo tanto, el marco que se describe aquí solo es aplicable a los cálculos iterativos e independientes, que se pueden paralelizar.
Marco de macros
Para admitir HPC Services para Excel, el libro debe incluir un conjunto de macros que implementan las funciones asincrónicas. Este es el marco de macros. Hay seis macros usadas en el marco, que puede agregar a cualquier libro de Excel. Las seis macros, con una breve descripción de lo que hacen, son
Nombre de macro | Acción |
---|---|
HPC_Initialize | Realizar los pasos de cálculo previo o inicialización |
HPC_Partition | Recopilación de parámetros necesarios para un solo paso de cálculo |
HPC_Execute | Realizar un paso de cálculo, como parte de un cálculo general mayor |
HPC_Merge | Procesar los resultados de un solo paso de cálculo |
HPC_Finalize | Realizar cualquier procesamiento posterior al cálculo |
HPC_ExecutionError | Control de errores derivados del cálculo |
(No se preocupe si esas descripciones no están claras inmediatamente: describiremos cada una de estas funciones con más detalle a continuación).
Las mismas macros deben agregarse a cualquier hoja de cálculo para admitir el cálculo en el clúster, pero lo que hay en las macros (las funciones de cálculo específicas) pueden ser diferentes. Para simplificar el proceso, los archivos de descarga incluidos en este artículo incluyen un archivo de macro "esqueleto" que puede importar en el libro. Una vez que haya implementado las macros básicas, puede rellenarlas según sea necesario para admitir el cálculo.
Cada macro tiene un propósito específico en el marco de macros y la biblioteca cliente de HPC Services para Excel llamará a cada una durante un cálculo del clúster. Cuando se ejecuta un cálculo, se llamará a cada macro en un punto específico. Un cálculo típico se ejecuta de esta manera:
Cuando se ejecuta un cálculo de clúster, primero la biblioteca cliente llamará a la macro HPC_Initialize . Se usa para controlar cualquier inicialización necesaria; por ejemplo, es posible que quiera borrar los resultados antiguos de la hoja de cálculo.
A continuación, el cálculo se ejecuta a través de tres macros: HPC_Partition, HPC_Execute y HPC_Merge. En el diagrama anterior, se muestran como un bucle. Eso no es realmente lo que sucede durante un cálculo, pero lógicamente se puede pensar en esto como un bucle. En primer lugar, la biblioteca cliente llama a HPC_Partition. HPC_Partition está diseñado para recopilar los datos necesarios para un solo paso de cálculo. Por ejemplo, si desea calcular un conjunto de filas una por una, HPC_Partition podría devolver el número de fila para un solo paso: primera fila 1, después fila 2, etc.
A continuación, se llama a la macro HPC_Execute . Esta macro ejecuta el cálculo real. Si estamos calculando fila por fila, se calculará una sola fila. HPC_Execute devolverá el resultado del cálculo: por ejemplo, podría devolver la última celda de la fila que es el resultado final de un cálculo más largo.
Después de HPC_Execute, la biblioteca cliente llamará a HPC_Merge. Cualquier HPC_Execute haya calculado se enviará a HPC_Merge. La macro HPC_Merge está diseñada para tomar esos resultados y devolverlos a la hoja de cálculo que se ejecuta en el escritorio. En la macro HPC_Merge , puede volver a insertar los resultados del cálculo en la hoja de cálculo o escribirlos en un archivo de registro.
Estas tres macros ( HPC_Partition, HPC_Execute y HPC_Merge ) se llamarán varias veces, una vez para cada paso del cálculo, hasta que se complete todo el cálculo. Estas macros implementan el modelo de cálculo iterativo descrito anteriormente. Las macros pueden llamarse muchas veces durante un único cálculo del libro, pero cada vez que se llaman representa un solo paso de cálculo o iteración.
Una vez completado el último paso de cálculo, la biblioteca cliente llamará a HPC_Finalize. Puede usar esta macro para realizar cualquier procesamiento posterior al cálculo: por ejemplo, puede que desee encontrar el promedio de todos los pasos de cálculo anteriores mediante otra macro de VBA.
La sexta y final macro, HPC_ExecutionError, solo se usa cuando el cálculo encuentra algún error. Si es así, se llama a esta macro y puede agregar código de control de errores; por ejemplo, podría mostrar un cuadro de diálogo emergente al usuario que les avisa del error.
En el diagrama anterior, la macro HPC_Execute está resaltada en naranja. Esto es para indicar que esta macro es algo inusual. Todas las demás macros se ejecutan en el escritorio, en Excel en la estación de trabajo. Sin embargo, cuando se ejecuta un cálculo en un clúster de HPC, la macro HPC_Execute se ejecuta realmente en los nodos de proceso del clúster.
Así es como HPC Services for Excel y el marco de macros admiten el cálculo del clúster. Mientras se escriben todas las macros en el mismo libro (el libro del escritorio) cuando se ejecuta el cálculo, el libro se copiará en los nodos de proceso del clúster y la macro HPC_Execute se ejecutará en uno de los nodos de proceso.
Es importante comprender esto, ya que tiene algunas implicaciones sobre cómo los libros usan y administran los datos durante el cálculo. Las tres macros de cálculo principales , HPC_Partition, HPC_Execute y HPC_Merge , pasan los datos de vuelta y adelante durante el proceso de cálculo. En una aplicación de VBA típica, hay muchas maneras de compartir datos entre distintas macros. Por ejemplo, puede usar variables globales en el código VBA o escribir valores en celdas de hoja de cálculo. Pero cuando se ejecuta el cálculo en un clúster de HPC, es necesario enviar datos entre las macros que se ejecutan en el escritorio y la macro HPC_Execute que se ejecuta en los nodos de proceso.
Por ese motivo, los datos que necesitamos para ejecutar el cálculo deben enviarse desde la macro HPC_Partition a la macro HPC_Execute directamente. Para ello, se usa el valor devuelto de la macro HPC_Partition . Ese valor devuelto se convierte en el argumento (o parámetro) en la función HPC_Execute . Por lo tanto, los datos pasarán directamente entre estas dos macros y puede pasar cualquier valor o conjunto de valores (como una matriz) entre estas macros. Pero de nuevo, no puede usar variables globales ni celdas de hoja de cálculo para pasar información entre las dos macros porque, cuando se ejecuta en el clúster, en realidad hay varias copias del libro que se ejecutan al mismo tiempo, una en el escritorio y otra (o más) en los nodos de proceso del clúster.
De la misma manera, cuando se complete el cálculo en HPC_Execute , devolverá un resultado como el valor devuelto de la función de macro. Ese resultado se convierte en el argumento (o parámetro) en la siguiente macro, HPC_Merge. Una vez más, los resultados que desee devolver (los resultados del cálculo) deben enviarse de esta manera, como valor devuelto de la función.
Creación de libros de Cluster-Enabled con Excel y HPC Services para Excel
En las secciones siguientes, veremos la creación de dos libros que admiten el cálculo en un clúster de HPC. En la primera sección, crearemos un libro desde cero. Esto le ayudará a comprender los conceptos implicados y los requisitos para usar HPC Services for Excel. En la segunda sección, tomaremos un libro existente (uno diseñado para ejecutarse en el escritorio) y lo convertiremos para que se pueda ejecutar en el clúster.
Antes de empezar: Requisitos previos y requisitos
HPC Services for Excel es un conjunto de herramientas incluidas con Microsoft HPC Pack 2008 R2 Beta 2 y versiones posteriores. Necesitará un clúster de Microsoft HPC Pack instalado y configurado. La instalación de un clúster de HPC está fuera del ámbito de este artículo; Solo abordaremos la configuración específica que necesitará para HPC Services for Excel. Para obtener más información sobre cómo instalar y configurar el clúster, consulte la documentación incluida con Microsoft HPC Pack. En el escritorio, necesitará las utilidades de cliente de HPC Pack.
En el clúster
Una vez que tenga un clúster de HPC en funcionamiento, deberá instalar Excel en los nodos de proceso del clúster. Puede usar el kit de instalación estándar de Office para instalar Excel o ver la documentación de HPC Pack para obtener más información sobre las formas de automatizar la instalación de Excel.
Una vez instalado Excel en los nodos de proceso del clúster, puede ejecutar la prueba de diagnóstico de HPC para asegurarse de que todo está configurado correctamente. Para ejecutar la prueba de diagnóstico, use el Administrador de clústeres de HPC (ya sea en el nodo principal del clúster, donde está instalado de forma predeterminada o en el escritorio si ha instalado las utilidades del cliente).
Para comprobar que el servicio HPC para Excel está configurado correctamente
En el Administrador de clústeres de HPC, haga clic en Diagnósticos.
En Pruebas, expanda Microsoft y, a continuación, seleccione Excel.
En el panel de vista, haga doble clic en Prueba de configuración del ejecutor de Excel.
En el cuadro de diálogo de configuración, seleccione Todos los nodos y, a continuación, haga clic en Ejecutar.
En el panel de navegación, haga clic en Resultados de pruebas para ver el progreso de la prueba. La prueba que está ejecutando aparece en el panel de vista.
Una vez completada la prueba, puede hacer clic en la prueba en la ventana principal para ver los resultados.
Si la prueba muestra Error, haga doble clic en la prueba e intente corregir los errores en la ventana emergente. Los errores comunes que puede ver son que Excel no está instalado en un nodo de proceso o que Excel no se ha activado. Realice los cambios que necesite y vuelva a ejecutar la prueba de diagnóstico mediante las instrucciones anteriores.
Cuando la prueba muestra Correcto, está listo para continuar.
Lo último que necesitará es un directorio de recursos compartidos. Cuando calculamos un libro en un clúster de HPC, cada uno de los nodos de proceso del clúster carga y ejecuta realmente una copia del libro. Para admitirlo, debe crear un directorio de recursos compartidos que sea visible tanto para los nodos de proceso del clúster como para el escritorio.
Si tiene acceso al nodo principal del clúster, cree un directorio de recurso compartido en el nodo principal. Esto es conveniente porque sabe que los nodos de proceso del clúster pueden acceder al nodo principal. Si no puede crear un directorio de recursos compartidos en el nodo principal, cree el directorio de recursos compartidos en cualquier parte del dominio al que se pueda acceder tanto al escritorio como a los nodos de proceso del clúster.
En el escritorio
En el escritorio, deberá instalar Excel y las utilidades de cliente de Microsoft HPC Pack (la instalación de las utilidades de cliente requerirá permisos de administrador). Para instalar las utilidades de cliente, ejecute el instalador de HPC Pack en el escritorio. Ofrecerá una opción para instalar solo las utilidades de cliente.
Resumen
Ahora debería tener:
Un clúster de Microsoft HPC instalado y configurado.
Excel 2016 (o posterior) instalado en los nodos de proceso del clúster.
Un directorio de recursos compartidos de red.
Excel 2016 (o posterior) y las utilidades cliente de Windows HPC Pack instaladas en el escritorio.
Cuando todo esté listo, puede empezar a compilar libros que se ejecutan en el clúster con HPC Services for Excel.
Parte I: Creación de un libro desde cero
Esta parte incluye las secciones siguientes:
Inicio de un nuevo libro
Preparación del libro
Diseño del cálculo del clúster
Ejecución del libro en el clúster
Últimos pasos: interfaz de usuario
Inicio de un nuevo libro
Inicie Excel con un nuevo libro. Usaremos VBA, así que asegúrese de que tiene la pestaña Programador disponible en la cinta de Excel.
Para activar la pestaña Programador
Haga clic en la pestaña Archivo de la cinta de Excel.
Haga clic en Opciones.
En el cuadro de diálogo Opciones de Excel, seleccione Personalizar cinta de opciones a la izquierda.
Active la casilla situada junto a Desarrollador y haga clic en Aceptar para cerrar el cuadro de diálogo.
Preparación del libro
Para preparar el libro, debe importar los archivos de macro y agregar las referencias de HPC.
Para compilar el libro básico, necesitaremos dos conjuntos de macros. El primer conjunto de macros implementa las funciones del marco (las funciones descritas en la sección Información general anterior). Estas macros las usa la biblioteca cliente de HPC Services para Excel durante el cálculo. El segundo conjunto de macros contiene las funciones de "control", estas macros ejecutan el cálculo real.
Los archivos de ejemplo incluyen archivos de macro "esqueleto" básicos para cada uno de ellos que puede usar para empezar. No tiene que usar estos archivos , también puede escribir sus propios, si lo prefiere, pero las macros son genéricas y es posible que encuentre que el uso de estos archivos es todo lo que necesita. También puede modificar estos archivos para realizar cualquier cambio que necesite para su libro concreto.
Tendremos que agregar dos referencias a este proyecto para usar HPC Services: Microsoft_Hpc_Excel y Microsoft_Hpc_Scheduler_Properties. Microsoft_Hpc_Excel es la biblioteca cliente, que proporciona un objeto que se puede usar para controlar un cálculo del clúster. Microsoft_Hpc_Scheduler_Properties tiene definiciones para algunos campos y tipos específicos del clúster que necesitaremos.
Nota: En la sección Información general anterior, se describen las herramientas como un marco de cliente o servidor; la biblioteca cliente se instaló cuando instaló el SDK de HPC Pack y ahora estará disponible en VBA.
Para importar los archivos de macro y agregar referencias
En la pestaña Programador de la cinta de opciones, haga clic en Visual Basic para abrir el editor de VBA.
En el editor de VBA, haga clic con el botón derecho en Proyecto de VBA en la parte superior de la vista de árbol y, a continuación, haga clic en Importar archivo.
En el cuadro de diálogo, busque los archivos de proyecto que descargó. Vaya al directorio "First Workbook", seleccione el archivo "HPC Excel Macros.bas" y haga clic en Aceptar. Esto agrega el primer archivo de macro al proyecto y estará disponible en la carpeta Módulos de la ventana del proyecto de VBA.
Repita los pasos del 1 al 3 para importar "Macros de control HPC.bas" y, a continuación, haga clic en Aceptar. Esto agrega el segundo archivo de macro al proyecto.
Compruebe que estos dos archivos de macro aparecen en la ventana del proyecto de VBA:
En la ventana del editor de VBA, haga clic en Herramientasy, a continuación, haga clic en Referencias para abrir el cuadro de diálogo Referencias del proyecto.
En la lista de referencias disponibles, desplácese hacia abajo hasta que encuentre ensamblados de HPC Pack de Microsoft (R) y active la casilla situada junto a cada una. Cuando haya activado las casillas, el cuadro de diálogo tendrá este aspecto:
Haga clic en Aceptar para cerrar el cuadro de diálogo referencias del proyecto.
Si no encuentra esta entrada en la lista, haga clic en Examinar. y busque el archivo %CCP_HOME%\Bin\Microsoft.Hpc.Excel.tlb. Si todavía no lo encuentra, compruebe que ha instalado los componentes de cliente de HPC Pack. Si los archivos están instalados, el panel de control Agregar o quitar programas muestra una entrada para "Componentes de cliente de Microsoft HPC Pack". Si no ve esa entrada, intente volver a instalar los componentes de cliente como se describe en la sección anterior "Antes de empezar".
Definición de los cálculos en el marco de macros
Nuestro objetivo en la creación de este libro es ilustrar cómo funciona un cálculo de clúster, por lo que no es necesario crear una hoja de cálculo muy complicada. Crearemos un cálculo que ejecute 100 pasos individuales. Para ello, agregaremos un contador al archivo de macros de HPC Excel y usaremos ese contador en las macros cuando se ejecute el cálculo.
Usaremos el contador para realizar un seguimiento del número de pasos de cálculo que se han enviado, por lo que podemos limitar el cálculo a 100 pasos. HPC_Initialize se llama cada vez que iniciamos un nuevo cálculo, por lo que podemos restablecer el contador en esa función. Queremos incrementar el contador para cada paso de cálculo. Podemos hacerlo en la macro HPC_Partition . Recuerde que la macro HPC_Partition se usa para recopilar los datos necesarios para un paso de cálculo individual; y una vez completado el cálculo, la macro HPC_Partition debe devolver Null. Por lo tanto, para ejecutar un cálculo de 100 pasos, incrementaremos el contador cada vez que se llame a HPC_Partition ; y una vez que el contador alcance 100, devolveremos Null.
Para construir un cálculo que ejecute 100 pasos
En la ventana del proyecto VBA, en la carpeta Módulos , haga doble clic en HPCExcelMacros.
En la parte superior del archivo, en "Sección 1: Variables y constantes", agregue una variable de contador denominada SentRecords como se muestra a continuación:
'========================================================== ' ' Section 1: Variables and constants ' '========================================================== Dim SentRecords As Integer
Desplácese hacia abajo hasta que encuentre la función HPC_Initialize y agregue una línea para restablecer la variable de contador:
'---------------------------------------------------------- ' ' HPC_Initialize will be called when the client starts ' a calculation. Put any pre-calculation steps in this ' function. ' '---------------------------------------------------------- Public Function HPC_Initialize() SentRecords = 0 End Function
Desplácese hacia abajo hasta que encuentre la macro HPC_Partition y modifíquela para que tenga este aspecto:
Public Function HPC_Partition() As Variant If SentRecords = 100 Then HPC_Partition = Null Else SentRecords = SentRecords + 1 HPC_Partition = SentRecords End If End Function
Guarde el libro.
Nota: Dado que el nuevo libro incluye macros, deberá guardarlo como un libro habilitado para macros (archivo XLSM) o un libro binario (archivo XLSB). Cualquiera de ellos está bien. Por lo general, se recomienda guardar libros como archivos binarios (XLSB), ya que son más pequeños y un poco más eficientes.
Ahora tenemos un cálculo que ejecutará 100 pasos y, a continuación, se completará. Las modificaciones que acaba de realizar son todas las que tiene que hacer para crear un cálculo del clúster de Excel.
Ejecución local del libro y exploración de las macros
Ahora que tenemos un cálculo, podemos agregar un botón para ejecutar el libro y, a continuación, ejecutar el libro en el escritorio. Para ver cómo funcionan las macros, agregaremos algunos fragmentos de código nuevos al esqueleto de la macro y volveremos a ejecutar el libro para ver lo que hicieron los cambios. Probaremos el libro localmente (en el escritorio) antes de ejecutar el libro en el clúster.
Adición de un botón que ejecuta el libro localmente
Para agregar un botón que ejecuta el libro localmente
Con el libro de Excel abierto, haga clic en la pestaña Programador de la cinta de opciones.
En la pestaña Programador , haga clic en Insertar y, a continuación, seleccione el control de botón , el primer control de la lista.
Después de hacer clic en el botón, dibuje un rectángulo en algún lugar de la hoja de cálculo para insertar el botón en esa ubicación. Después de colocar el botón, aparece el cuadro de diálogo Asignar macro .
En el cuadro de diálogo, seleccione la macro CalculateWorkbookOnDesktop de la lista y, a continuación, haga clic en Aceptar. Asegúrese de seleccionar la macro de escritorio: queremos probar primero el libro y buscar los errores antes de ejecutarlo en el clúster.
Haga clic con el botón derecho en el botón nuevo y seleccione Editar texto para cambiar la etiqueta.
Asigne un nombre a la etiqueta "Desktop" o algo similar.
Opcionalmente, puede comprobar que ha asignado la macro correcta haciendo clic con el botón derecho en el botón y seleccionando Asignar macro. En el cuadro de diálogo, compruebe que CalculateWorkbookOnDesktop está seleccionado.
Guarde el libro.
Haga clic en el botón para ejecutar el libro en el escritorio.
Si hay algún error, verá un cuadro de diálogo de error y la parte del código VBA con el error se resaltará; vuelva a las secciones anteriores y compruebe que todo parece correcto.
Si todo funciona, no ocurrirá nada porque nuestro libro no hace nada. Esto es un poco poco satisfactorio, por lo que vamos a realizar algunos cambios más para que podamos ver el cálculo.
Modificar el HPC_Excecute y las macros de HPC_Merge
Recuerde que el flujo de información va de HPC_Partition (que recopila los parámetros necesarios para el cálculo), a HPC_Execute (que ejecuta el cálculo) y, a continuación, a HPC_Merge (que procesa el resultado). Cuando se ejecuta un cálculo, lo que se devuelve de la macro HPC_Partition se usa como entrada para la macro HPC_Execute . La macro HPC_Execute está diseñada para usar esos datos de entrada, realizar algún paso de cálculo y, a continuación, devolver un resultado. A continuación, el resultado pasa a HPC_Merge, lo que puede insertar los resultados en la hoja de cálculo.
En un paso anterior, agregó código a la macro HPC_Partition para actualizar una variable de contador. Por lo tanto, en nuestro ejemplo, HPC_Partition devuelve el valor de la variable counter y pasa ese valor a HPC_Execute. Para ilustrar el flujo de información y hacer que nuestro libro devuelva algunos resultados, simplemente pasaremos este valor de contador a través de las macros. Agregaremos una línea de código a la macro HPC_Execute para que tome la entrada y la pase como valor devuelto. A continuación, el valor de la variable de contador pasa a la macro HPC_Merge , que modificaremos para que inserte el valor del contador en nuestra hoja de cálculo.
Para modificar HPC_Execute y HPC_Merge
En la pestaña Programador de la cinta de opciones, haga clic en Visual Basic para abrir el editor de VBA.
En el editor de VBA, en el árbol del proyecto, haga doble clic en el módulo HPCExcelMacros para abrir el archivo de macro.
. Desplácese hasta la macro HPC_Execute y agregue una línea de código que pase el valor de entrada como valor devuelto. La macro debe tener este aspecto:
Public Function HPC_Execute(data As Variant) As Variant HPC_Execute = data End Function
Desplácese hasta la macro HPC_Merge y agregue una línea de código para insertar el valor de entrada en la hoja de cálculo. La macro debe tener este aspecto:
Public Function HPC_Merge(data As Variant) Cells(data, 1).Value = data End Function
Nota: El valor "data" es el contador, que se devolvió de HPC_Execute. Por lo tanto, aquí en la macro HPC_Merge , estamos rellenando una celda en la hoja de cálculo , usando el contador como número de fila y estableciendo el valor para que sea el contador. La expresión VBA "Cells" significa crear una referencia en la hoja de cálculo con los números de fila y columna especificados. Por lo tanto, cada vez que se llama a la macro HPC_Merge , insertará un valor en la columna 1 (columna A de la hoja de cálculo), con un número de fila diferente.
Ahora vuelva a la hoja de cálculo y haga clic en el botón "Escritorio" para ejecutar el cálculo.
Verá que la primera columna se rellena con números de 1 a 100, que son los valores de contador. Cada vez que haga clic en el botón, rellenará los mismos números, por lo que es difícil saber que se está ejecutando; podemos hacer un cambio más pequeño para ver los números rellenados.
Modificación de la macro de HPC_Initialize
Se llama a la macro HPC_Initialize cuando se ejecuta por primera vez el libro. En un paso anterior, se ha agregado una línea de código para restablecer la variable de contador. También podemos usar esta macro para borrar los valores que se insertaron en la hoja de cálculo durante la ejecución anterior.
Para modificar la macro de HPC_Initialize
En la pestaña Programador de la cinta de opciones, haga clic en Visual Basic para abrir el editor de VBA.
En el editor de VBA, en el árbol del proyecto, haga doble clic en el módulo HPCExcelMacros para abrir el archivo de macro.
Desplácese hasta la macro de HPC_Initialize **.** Agregue una línea de código que vacía la primera columna. La macro debe tener este aspecto:
Public Function HPC_Initialize() Range("A:A").Value = "" SentRecords = 0 End Function
Ahora vuelva a la hoja de cálculo y haga clic en el botón "Escritorio" para ejecutar el cálculo.
Ahora debería ser obvio que la macro está rellenando la columna con números cada vez que se hace clic en ella. Si hay algún error, verá un mensaje de error y el código VBA con el error se resaltará: compruebe que coincide con el código anterior e inténtelo de nuevo.
Ejecución del libro en el clúster
Ahora tenemos un cálculo de Excel muy sencillo mediante el marco de macros de HPC y podemos ejecutarlo en el clúster. Para ello, primero es necesario establecer algunos valores para indicar a Excel cómo ponerse en contacto con el clúster. Estos valores se definen en el módulo HPCControlMacros **.** En la parte superior de este archivo, hay dos valores que deberá rellenar: el programador del clúster y el directorio de recursos compartidos. Recuerde que usted (el usuario de escritorio) debe tener acceso de escritura a este directorio de recursos compartidos; y los nodos de proceso del clúster deben tener acceso de lectura al directorio. En la mayoría de los casos, los cálculos del clúster se ejecutarán en la cuenta de usuario, pero es posible usar una cuenta de usuario diferente al conectarse a la sesión del clúster (más adelante en un momento).
Para especificar el nodo principal y el directorio de recursos compartidos
En la pestaña Programador de la cinta de opciones, haga clic en Visual Basic para abrir el editor de VBA.
En el editor de VBA, en el árbol del proyecto, haga doble clic en el módulo HPCControlMacros para abrir el archivo de macro.
Para el programador de clústeres, use el nombre del nodo principal del clúster; este es el nombre del equipo que usaría en la red. Puede usar un nombre completo (por ejemplo, headnode.mynetwork.com), pero no es necesario si está en el mismo dominio.
Para el directorio de recursos compartidos, use la ruta de acceso completa al directorio del recurso compartido que creó anteriormente (en la sección "Antes de empezar").
Por ejemplo, en mi clúster, el nombre del programador es "HN01"; y he creado un directorio de recursos compartidos en el nodo principal denominado "HPCTemp". Así que mi configuración tiene este aspecto:
'----------------------------------------------------------
'
' This is the cluster scheduler, or head node. Fill in
' the hostname of your cluster scheduler.
'
'----------------------------------------------------------
Private Const HPC_ClusterScheduler = "HN01"
'----------------------------------------------------------
'
' This is a network share used to store a temporary copy
' of the workbook. Make sure that the directory exists,
' that you have write access to the directory, and that
' the compute nodes in the cluster have read access.
'
'----------------------------------------------------------
Private Const HPC_NetworkShare = "\\HN01\HPCTemp"
Ahora vuelva a la hoja de cálculo de Excel. Agregaremos otro botón, esta vez para ejecutar el cálculo en el clúster.
Para agregar un botón que ejecute el libro en el clúster
En la pestaña Programador , haga clic en Insertar y, a continuación, seleccione el control de botón , el primer control de la lista.
Después de hacer clic en el botón, dibuje un rectángulo en algún lugar de la hoja de cálculo para insertar el botón en esa ubicación. Después de colocar el botón, aparece el cuadro de diálogo Asignar macro .
En el cuadro de diálogo, seleccione la macro CalculateWorkbookOnCluster de la lista y, a continuación, haga clic en Aceptar.
Haga clic con el botón derecho en el botón nuevo y seleccione Editar texto para cambiar la etiqueta.
Asigne un nombre a la etiqueta "Cluster" o algo similar.
Guarde el libro.
Haga clic en el botón para ejecutar el libro en el clúster.
Si es la primera vez que ha ejecutado cualquier trabajo de clúster, ya sea mediante Excel o con cualquier otra aplicación, verá un cuadro de diálogo de autenticación de usuario. Escriba el nombre de usuario y la contraseña y, si lo desea, active la casilla para guardar sus credenciales. Si desea ejecutar cálculos en el clúster como un usuario diferente, puede especificar una configuración de cuenta de usuario diferente.
Nota: Asegúrese de que la cuenta de usuario (ya sea la cuenta de usuario estándar o lo que quiera usar) se designa como usuario de clúster en el Administrador de clústeres de HPC.
Si hay algún error, verá un cuadro de mensaje que describe el error. Si el cálculo funcionó en el escritorio, los errores más probables que recibirá ahora tienen que ver con la configuración del clúster, el nodo principal o el directorio de recursos compartidos. Si el cuadro de mensaje describe cualquiera de esos errores, compruebe la configuración que ha cambiado en el último paso. Asegúrese de que tiene el nombre correcto para el nodo principal del clúster y de que la cuenta de usuario puede escribir el directorio de recursos compartidos.
¿Qué ocurre cuando un libro se ejecuta en el clúster?
Vamos a revisar lo que sucede al ejecutar el cálculo del clúster. Al hacer clic en el botón, llama a la macro CalculateWorkbookOnCluster. Esa macro usa la biblioteca cliente para iniciar un cálculo del clúster con la configuración que proporcionó para el nodo principal del clúster y el directorio de recursos compartidos.
Cuando se inicia el cálculo, el código de cliente de HPC Services para Excel toma el control. Recuerde que ha agregado una referencia a la biblioteca HPC en el editor de VBA al principio de esta parte, que es la biblioteca cliente. En primer lugar, la biblioteca cliente creará un clúster "sesión", que se usa para administrar el cálculo. Esto tarda unos segundos y, después de hacer clic en el botón, observará un retraso de unos segundos.
A continuación, la biblioteca cliente llamará a la macro HPC_Initialize . Eso sucede en el escritorio. En este libro, esa macro (1) restablece el contador interno; y (2) vacía la columna A de la hoja de cálculo. Por lo tanto, al hacer clic en el botón, primero verá el retraso a medida que se crea la sesión; y, a continuación, verá que la columna A está desactivada. Esa es la macro HPC_Initialize .
A continuación, la biblioteca cliente comenzará a llamar a la macro HPC_Partition . Esto también sucede en el escritorio. En nuestro código, la macro HPC_Partition incrementa el contador y devuelve el valor del contador. Cada vez que esta macro devuelve un valor ,hasta que devuelve Null, en la última llamada, la biblioteca cliente enviará una solicitud al programador de HPC.
Cuando el programador recibe una de estas solicitudes, reenviará la solicitud a uno de los nodos de proceso del clúster para su procesamiento. Cuando el nodo de proceso recibe la solicitud, iniciará Excel, cargará el libro y, a continuación, llamará a la macro HPC_Execute .
Esta es la macro HPC_Execute que tenemos en nuestro libro, pero cuando el cálculo se ejecuta en el clúster, la macro HPC_Execute se ejecuta realmente en los nodos de proceso, a diferencia de todas las demás macros. Por eso estamos pasando datos de una macro a otra. La información fluye de una macro a la siguiente, pero a medida que se pasan datos de la macro de HPC_Partition a la macro HPC_Execute , se envía desde el escritorio, a través del programador de HPC y a uno de los nodos de proceso.
Una vez que uno de los nodos de proceso ejecuta la macro de HPC_Execute , cuando la macro se completa con el resultado del cálculo , el valor devuelto por la macro HPC_Execute , se devuelve al programador y, a continuación, se devuelve a la biblioteca cliente en el escritorio. Cuando la biblioteca cliente recibe el resultado del cálculo, llamará a la macro HPC_Merge en el escritorio. Por lo tanto, una vez más puede pensar en la información que fluye de una macro (HPC_Execute) a la siguiente (HPC_Merge), pero esto sucede a través de la red: desde el libro que se ejecuta en el nodo de proceso hasta el libro que se ejecuta en el escritorio.
Es importante comprender que estas llamadas a función de macro (cada una de las llamadas a HPC_Partition, a medida que se envían datos al clúster y cada una de las llamadas a HPC_Merge, a medida que se reciben datos) se producen de forma asincrónica. Es decir, cuando se envía un cálculo al clúster, la biblioteca cliente no esperará (o bloqueará) hasta que se complete ese cálculo concreto antes de enviar el siguiente. Si la macro HPC_Partition es muy rápida, como en este caso, es posible que se envíen todas las 100 solicitudes de cálculo antes de que se complete cualquiera de esas solicitudes.
También merece la pena tener en cuenta que, a medida que los resultados vuelven del clúster (y se llama a la macro HPC_Merge en nuestro libro), es posible que no vuelvan en el mismo orden en que los hemos enviado. Esto se debe a que, a medida que cada solicitud se envía al clúster, el programador lo reenvía a un nodo de proceso determinado. El nodo de proceso calculará la solicitud, mediante la macro HPC_Execute en el libro y, a continuación, devolverá el resultado. Pero por varias razones, un nodo de proceso podría ejecutarse más lenta o más rápidamente que otro nodo de proceso; y si esto sucede, los resultados se pueden devolver en un orden diferente.
Probablemente no notará que en este libro, porque las macros son tan sencillas. Pero es algo que tendremos que preparar en libros más complicados, ya que tenemos funciones de cálculo más largas y lo abordaremos a continuación cuando creemos un libro "real".
Comunicación del progreso del cálculo
En este momento ha creado un libro completo que se ejecuta en el clúster de HPC; Ahora debería comprender lo que hacen las distintas macros y por qué están diseñados de la manera en que lo son. Debe tener una idea de cómo se mueven los datos entre las macros y qué elementos se ejecutan en el escritorio y en el clúster.
Antes de terminar con el libro simple, podemos realizar algunos cambios finales para agregar algunos comentarios visuales, básicamente una interfaz de usuario sencilla. Cuando ejecutó el libro en el clúster, los únicos comentarios que tenía que funcionaban eran los números que rellenaban la hoja de cálculo. Es un comienzo, pero podemos realizar algunos cambios que harán que sea más obvio lo que está haciendo el libro. Lo que vamos a hacer es agregar algunas variables más para realizar un seguimiento del cálculo y, a continuación, mostrarlas en la barra de estado de Excel.
Nuestro código incluirá los siguientes contadores:
Ya tenemos una variable de contador que realiza un seguimiento del número de veces que se llamó a HPC_Partition macro. Que representa el número de veces que se enviaron datos desde el escritorio al clúster.
Podemos agregar otro contador que se incrementa cada vez que se llama a la macro HPC_Merge , que representa cuántas veces los datos vuelven del clúster al escritorio.
También podemos agregar algunas variables para realizar un seguimiento del tiempo: cuánto tarda el cálculo. Esto puede ser realmente útil para comprobar si el cálculo del clúster es más rápido que el escritorio (y, si es así, cuánto más rápido).
Con estos dos primeros contadores, podemos ver el número de solicitudes pendientes y obtener una idea del progreso general del cálculo. Agregaremos una nueva función de VBA que pueda notificar el estado de cálculo. Esta función tiene tres partes:
Crea una cadena que muestra el número de cálculos enviados (el número de veces que se llamó a HPC_Partition ) y el número de resultados recibidos (el número de veces que se llamó a HPC_Merge ).
Si la variable "CalculationComplete" es true, actualiza la cadena para mostrar el tiempo de cálculo total.
Usa Application.StatusBar para establecer el mensaje de la barra de estado de Excel con la información que acabamos de crear.
Podemos usar las macros de HPC que ya están en su lugar para actualizar estos valores y actualizar el mensaje de la barra de estado con la nueva función.
En el procedimiento siguiente se describe cómo incorporar estos nuevos elementos en nuestro ejemplo.
Para agregar variables de progreso a las macros y actualizar la barra de estado de Excel
Vuelva al editor de VBA y haga doble clic en el módulo HPCExcelMacros para abrir el código de macro. En la parte superior del código VBA, después del contador original, agregue estas nuevas variables:
'========================================================== ' ' Section 1: Variables and constants ' '========================================================== Dim SentRecords As Integer Dim RcvRecords As Integer Dim CalculationComplete As Boolean Dim StartTime As Double Dim FinishTime As Double
A continuación, agregaremos una nueva función de VBA denominada "UpdateStatus" que puede notificar el estado de cálculo. Desplácese hacia abajo hasta la parte inferior del archivo y agregue código de la siguiente manera:
Sub UpdateStatus() Dim statusMessage As String statusMessage = "Calculated " & RcvRecords & "/" & SentRecords If CalculationComplete Then statusMessage = statusMessage & "; Completed in " & _ FormatNumber(FinishTime - StartTime) & "s" End If Application.StatusBar = statusMessage End Sub
Es necesario inicializar las variables. Al igual que con el contador original, lo haremos en la macro HPC_Initialize . Desplácese hasta esa macro y agregue algunas líneas:
Public Function HPC_Initialize() Range("A:A").Value = "" SentRecords = 0 RcvRecords = 0 StartTime = Timer CalculationComplete = False UpdateStatus End Function
Nota: Lo que estamos haciendo aquí es (1) borrar los dos contadores, establecerlos en cero; (2) establecer el valor "StartTime" en la hora actual (la llamada "Temporizador" en VBA devuelve la hora actual, en segundos); y (3) estableciendo la marca "CalculationComplete" en false, lo que significa que aún no se ha completado. Una vez establecidos estos valores, llamamos a la nueva macro "UpdateStatus" para escribir el mensaje en la barra de estado.
Desplácese hacia abajo hasta la macro HPC_Partition . En esta macro ya estamos estableciendo el primer contador, por lo que solo es necesario realizar un cambio: después de actualizar el contador, agregamos una línea para llamar a la nueva macro y actualizar la barra de estado.
Public Function HPC_Partition() As Variant If SentRecords = 100 Then HPC_Partition = Null Else SentRecords = SentRecords + 1 UpdateStatus HPC_Partition = SentRecords End If End Function
Ahora desplácese hacia abajo hasta la macro HPC_Merge . Aquí, queremos actualizar el nuevo contador, el que representa los mensajes devueltos de nuevo al escritorio y, de nuevo, actualizar la barra de estado. Por lo tanto, modifique la macro HPC_Merge :
Public Function HPC_Merge(data As Variant) Cells(data, 1).Value = data RcvRecords = RcvRecords + 1 UpdateStatus End Function
Desplácese hacia abajo hasta la macro de HPC_Finalize . Se llama a esta macro cuando se completa el cálculo completo; por lo que podemos usar esto para establecer la marca "CalculationComplete", así como para averiguar cuánto tiempo tardó el cálculo total:
Public Function HPC_Finalize() CalculationComplete = True FinishTime = Timer UpdateStatus ' Clean up the calculation. It's a good idea to ' leave this here, even if you make changes to ' this function. The function we call here is in ' the "HPCControlMacros" module. CleanUpClusterCalculation End Function
Nota: Cuando se establece el campo "FinishTime" en Timer, se establece con la hora actual, en segundos. En la macro UpdateStatus usamos "StartTime" y "FinishTime" para averiguar el tiempo de cálculo total.
Guardar el libro
Vuelva a la hoja de cálculo de Excel y haga clic en el botón "Clúster".
Verá la actualización de la barra de estado con números a medida que se ejecuta el cálculo; primero verá el número de cálculos enviados (el segundo número) saltar hasta 100 y, después, después de un breve retraso, verá que el número de resultados recibidos (el primer número) sube hasta 100.
Lo que ve aquí es la mensajería asincrónica que hemos descrito anteriormente. Dado que la macro HPC_Partition es tan rápida, la biblioteca cliente puede enviar todas las 100 solicitudes antes de que se complete cualquiera de los cálculos. Hay un breve retraso: ese retraso es que los nodos de proceso inician Excel y cargan el libro. Una vez que cada nodo de proceso ha iniciado Excel, calcular los resultados es bastante rápido y el primer número obtiene hasta 100 rápidamente.
Si hace clic en el botón "Escritorio", verá que los números se mueven de otra manera. En el escritorio, la biblioteca cliente llama a las mismas macros, pero lo hace de forma sincrónica (es decir, no de forma asincrónica). Para ejecutar el cálculo del escritorio, la biblioteca cliente llamará a cada macro a su vez , primero HPC_Partition, luego HPC_Execute y, a continuación, HPC_Merge , pero en este caso, esperará a que se complete cada macro antes de llamar a la siguiente. Por eso, al ejecutar en el escritorio, verá que ambos números se mueven juntos.
Parte 2: Conversión de un libro de "escritorio" para que se ejecute en el clúster de HPC
En la última sección, creamos un libro desde cero para calcular en un clúster de HPC. En esta sección, tomaremos un libro existente y lo modificaremos para que se ejecute en el clúster. Si siguió la última parte, debería tener una comprensión de lo que es necesario, aunque había muchos pasos individuales, el trabajo real implicado era muy sencillo. En resumen, hacemos lo siguiente:
Se agregaron dos archivos de macro.
Se agregaron dos referencias al proyecto de VBA.
Se han realizado algunas modificaciones en las macros.
Se han agregado botones para ejecutar la hoja de cálculo.
Convertir un libro existente es aproximadamente la misma cantidad de trabajo. No hay mucho código VBA nuevo que agregar y, la mayoría, si puede volver a usar los mismos archivos de macro de esqueleto. Para la mayor parte, la conversión de un libro existente implica mover código alrededor: copiar código de las macros existentes en las macros de HPC.
La parte difícil de convertir un libro existente es averiguar qué código se va a mover y dónde debe ir. Excel VBA es un entorno de desarrollo completo y hay muchas maneras de compilar aplicaciones de Excel: diferentes desarrolladores pueden escribir la misma aplicación de muchas maneras diferentes.
En esta sección, vamos a tomar un libro existente y convertirlo para que se ejecute en el clúster. Debe leer esta sección como guía, o como ejemplo, y luego intentar aplicar los conceptos a sus propios libros. En este caso, tenemos un ejemplo bastante sencillo (aunque se basa en un libro real que se usó para resolver un problema empresarial real). Para casi cualquier libro, el proceso será el mismo, pero los detalles específicos serán diferentes.
Análisis del libro
En Excel, abra el libro "ConvertiblePricing.xlsb" desde el directorio "Second Workbook". Es posible que reciba una advertencia sobre macros; Si es así, haga clic en "Habilitar macros" para continuar.
Este libro calcula los precios de los bonos convertibles, en función de los valores de la sección "Parámetros del modelo" de la izquierda. La tabla de la derecha se usa para comprender qué efecto tienen pequeños cambios en los parámetros (cambios en el precio de conversión y en la tasa de cupones) tendrán en el precio final.
Haga clic en el botón "Calcular tabla" de la hoja de cálculo. Verá que la tabla se rellena lentamente, ya que se calcula cada precio. En una estación de trabajo típica, rellenar la tabla completa tardará entre 1 y 2 minutos.
Para averiguar lo que hace este libro al hacer clic en el botón, podemos recorrer el código VBA.
Para identificar la macro y ver el código
Haga clic con el botón derecho en el botón "Calcular tabla" y seleccione Asignar macro.
El cuadro de diálogo de macro muestra qué macro usa actualmente el botón. En el cuadro de diálogo, haga clic en Editar para saltar al código. Debería ver el código de la macro "CalculateTable". Este es el código que se ejecuta al hacer clic en el botón de la hoja de cálculo.
Al examinar esta macro, puede ver algunas secciones distintas. En primer lugar, hay algunas declaraciones de variables. A continuación, hay código de inicialización. Por último, hay una sección que calcula la tabla: podemos identificar dónde recorre en bucle las filas y columnas de la tabla y rellena los valores.
Esta macro es bastante corta, pero si observa el bucle, verá que llama a otras funciones: las funciones "FullDiscountModel" y "BondPlusOptionModel". Estas son las rutinas de cálculo reales, la lógica de negocios que impulsa este libro.
En el editor de VBA, puede ir al origen de cualquier función haciendo clic con el botón derecho en el nombre y seleccionando "Definición". Si hace clic con el botón derecho en "FullDiscountModel" y selecciona "Definición", verá que el cálculo real es bastante complejo. Sin embargo, para convertir el libro para que se ejecute en el clúster, no es necesario modificar ni comprender ese cálculo. Solo tenemos que preocuparnos por el código de control, es decir, la función que contiene el bucle .
Este libro está muy bien diseñado, ya que la lógica de negocios está contenida en funciones independientes. En otros casos, todo este código podría estar en una sola macro, lo que haría que el libro fuera más difícil de entender. Pero en cualquier caso, lo que tendremos que hacer para convertir este libro es tomar el código de control (las rutinas de inicio y las funciones de bucle) y moverlos a las macros de HPC.
También sabemos que en este libro, los cálculos son independientes. Es decir, cada celda de la tabla se calcula sin hacer referencia a ninguna otra celda de la tabla. Esto significa que el libro es iterativo y admitirá la paralelización (como se describe en la sección Información general, arriba). Es posible que no siempre sea obvio que los cálculos son independientes. Una manera de averiguar esto es escribir algunas funciones de prueba (por ejemplo, podríamos volver a escribir la macro "CalculateTable" (la macro a la que se llama al presionar el botón en la hoja de cálculo) para ejecutar solo un cálculo o una celda de la tabla. De este modo, podríamos identificar si los resultados eran coherentes y, si es así, podríamos determinar si los cálculos eran independientes de hecho.
En resumen, las características más importantes para que cualquier libro admita la ejecución en un clúster de Microsoft HPC son las siguientes:
El libro es iterativo: ejecuta el mismo cálculo muchas veces, con diferentes conjuntos de datos de entrada; o ejecuta muchos cálculos individuales, como filas o celdas de una tabla, de uno en uno.
Los cálculos individuales son independientes: es decir, los resultados de un único cálculo no afectan a ninguno de los otros cálculos.
Ambos son verdaderos para este libro, por lo que es un buen candidato para ejecutarse en el clúster.
Preparación del libro
Al igual que en el último libro, los primeros cambios que realizaremos tendrán que ver con la configuración del entorno de VBA. Podemos usar archivos de macro de esqueleto para ahorrar tiempo, que incluirán las macros de HPC que necesitaremos para el cálculo.
En el último libro, hemos realizado algunos cambios en los archivos de macro de esqueleto para agregar algunos comentarios del usuario (mostrando el progreso del cálculo en la barra de estado de Excel). En este segundo libro, los archivos de macro esqueleto ya incluyen ese código de barra de estado.
Para importar los archivos de macro y agregar referencias
En la pestaña Programador de la cinta de opciones, haga clic en Visual Basic para abrir el editor de VBA.
En el editor de VBA, haga clic con el botón derecho en Proyecto de VBA en la parte superior de la vista de árbol y, a continuación, haga clic en Importar archivo.
En el cuadro de diálogo, busque los archivos de proyecto que descargó. Vaya al directorio "Second Workbook" (Segundo libro), seleccione el archivo "HPCExcelMacros.bas" y haga clic en Aceptar.
Repita los pasos del 1 al 3 para importar "HPCControlMacros.bas" y haga clic en Aceptar. Esto agrega el segundo archivo de macro al proyecto.
Compruebe que estos dos archivos de macro aparecen en la ventana del proyecto de VBA:
En la ventana del editor de VBA, haga clic en Herramientasy, a continuación, haga clic en Referencias para abrir el cuadro de diálogo Referencias del proyecto.
En la lista de referencias disponibles, desplácese hacia abajo hasta que encuentre ensamblados de HPC Pack de Microsoft (R) y active la casilla situada junto a él. Cuando haya activado la casilla, el cuadro de diálogo tendrá este aspecto:
Haga clic en Aceptar para cerrar el cuadro de diálogo referencias del proyecto.
Definición de los cálculos en el marco de macros
Con la configuración del entorno de VBA, podemos pasar al paso siguiente: modificar las macros para ejecutar el cálculo. El módulo HPCExcelMacros incluye las mismas macros que en el primer libro, solo esta vez incluyen los contadores y el código para actualizar la barra de estado.
Definición de variables y copia del código de inicialización de la macro original
Las primeras cosas que necesitaremos son contadores para la fila y la columna. En este libro, vamos a dividir el cálculo para que cada celda de la tabla se calcule por separado. La macro original usa bucles para ejecutarse a través de cada celda de la tabla, pero en las funciones de macro de HPC usamos el marco asincrónico, por lo que es necesario realizar un seguimiento de los números de fila y columna a medida que se envía cada cálculo individual. Usaremos variables de fila y columna en las macros para recorrer cada celda de la tabla; reflejan la fila y la columna que estamos calculando en cada paso.
Volveremos a la macro original para ver lo que hizo cuando se inició y, a continuación, lo moveremos a la macro HPC_Initialize .
Para establecer variables y modificar HPC_Initialize
En la pestaña Programador de la cinta de opciones, haga clic en Visual Basic para abrir el editor de VBA.
En el editor de VBA, en el árbol del proyecto, haga doble clic en el módulo HPCExcelMacros para abrir el archivo de macro.
En la parte superior del archivo, en "Sección 1: Variables y constantes", agregue variables de fila y columna, como se muestra a continuación:
'========================================================== ' ' Section 1: Variables and constants ' '========================================================== Dim CurrentRow As Integer Dim CurrentCol As Integer Dim SentRecords As Integer Dim RcvRecords As Integer Dim CalculationComplete As Boolean Dim StartTime As Double Dim FinishTime As Double
Desplácese hasta la macro HPC_Initialize e inicialice los contadores de fila y columna que acabamos de configurar:
Public Function HPC_Initialize() CurrentRow = 1 CurrentCol = 1 ' clear counters, capture starting time and update status bar SentRecords = 0 RcvRecords = 0 StartTime = Timer CalculationComplete = False UpdateStatus End Function
En el editor de VBA, haga doble clic en el módulo "ScenarioAnalysis" en la ventana del proyecto de VBA. Ese era el archivo que contiene el código de macro original. La parte de inicialización es la primera sección, que calcula el tamaño de la tabla y establece algunas variables (NumRows y NumCols):
' clear values, then figure out the size of the table Range("cashtable").ClearContents NumCols = 1 While NumCols < MaxSensTblSize And CDbl(Range("table1").Offset(0, NumCols … NumCols = NumCols + 1 Wend NumRows = 1 While NumRows < MaxSensTblSize And _ CDbl(Range("table1").Offset(NumRows + 1, 0).Value) <> 0 And _ CDbl(Range("table1").Offset(NumRows + 1, 0).Value) <> … NumRows = NumRows + 1 Wend
Copie el código de la macro original y vuelva al módulo HPCExcelMacros (haga doble clic en HPCExcelMacros en la ventana del proyecto de VBA) y péguelo en la macro HPC_Initialize .
El código final de HPC_Initialize ahora tiene este aspecto:
Public Function HPC_Initialize()
' clear values, then figure out the size of the table
Range("cashtable").ClearContents
NumCols = 1
While NumCols < MaxSensTblSize And CDbl(Range("table1").Offset(0, NumCols + …
NumCols = NumCols + 1
Wend
NumRows = 1
While NumRows < MaxSensTblSize And _
CDbl(Range("table1").Offset(NumRows + 1, 0).Value) <> 0 And _
CDbl(Range("table1").Offset(NumRows + 1, 0).Value) <> …
NumRows = NumRows + 1
Wend
CurrentRow = 1
CurrentCol = 1
' clear counters, capture starting time and update status bar
SentRecords = 0
RcvRecords = 0
StartTime = Timer
CalculationComplete = False
UpdateStatus
End Function
Modificación de la macro de HPC_Partition
La siguiente macro que se va a modificar es la macro HPC_Partition . Recuerde que esta macro recopila los datos necesarios para ejecutar un único cálculo. En este caso, será el número de fila y columna. Para este libro, queremos calcular cada celda de tabla individual en el clúster por separado; y para ello, usaremos el número de fila y columna.
Todas las macros del marco de HPC usan el tipo de datos Variant para entradas y salidas. El tipo Variant puede ser cualquier tipo primitivo (entero, largo, doble, cadena) o una matriz de estos tipos. Es necesario incluir tanto la fila como la columna, por lo que podemos usar una matriz.
La otra cosa que debemos hacer en la macro HPC_Partition es averiguar cuándo se completa el cálculo. En este caso, el cálculo se completará cuando hayamos llegado al final de la tabla. Podemos hacerlo incrementando los números de fila y columna a medida que se desplaza por la tabla. Cada vez que llegamos al final de una columna, pasamos a la columna siguiente. Cuando hemos pasado la última columna, la tabla finaliza y queremos que la función devuelva Null.
Para modificar la macro de HPC_Partition
En el código HPCExcelMacros , desplácese hasta la sección HPC_Partition y agregue código para declarar una matriz para la fila y la columna:
Public Function HPC_Partition() As Variant Dim data(3) As Variant ' update the status bar with the counters SentRecords = SentRecords + 1 UpdateStatus End Function
Agregue código para comprobar el final de la tabla. Esto finalizará el cálculo cuando hayamos terminado la tabla.
Public Function HPC_Partition() As Variant Dim data(3) As Variant ' first check the row; if we're past the bottom ' of the table, increment the column and set the ' row back to the top If CurrentRow > NumRows Then CurrentRow = 1 CurrentCol = CurrentCol + 1 End If ' next check the column; if we're past the last ' column, then we're done If CurrentCol > NumCols Then ' return null to indicate the end of the calculation HPC_Partition = Null ' and exit the function now, we can skip the rest Exit Function End If ' update the status bar with the counters SentRecords = SentRecords + 1 UpdateStatus End Function
Si aún no hemos terminado la tabla, la última parte de la función almacenará los valores de fila y columna y los usará como valor devuelto para la función; y, a continuación, vaya a la siguiente fila:
Public Function HPC_Partition() As Variant Dim data(3) As Variant ' first check the row; if we're past the bottom ' of the table, increment the column and set the ' row back to the top If CurrentRow > NumRows Then CurrentRow = 1 CurrentCol = CurrentCol + 1 End If ' next check the column; if we're past the last ' column, then we're done If CurrentCol > NumCols Then ' return null to indicate the end of the calculation HPC_Partition = Null ' and exit the function now, we can skip the rest Exit Function End If data(0) = CurrentRow data(1) = CurrentCol HPC_Partition = data ' move to the next row CurrentRow = CurrentRow + 1 ' update the status bar with the counters SentRecords = SentRecords + 1 UpdateStatus End Function
Por lo tanto, para revisar, la macro HPC_Partition tiene dos propósitos: recopila los parámetros necesarios para un único cálculo (aquí es el número de fila y columna); y cuando el cálculo se completa indica que devolviendo Null. En la función que hemos creado, lo hace paso a paso por la tabla, primero por fila y por columna, y cuando se pasa la última columna, devuelve Null para indicar que la tabla está completa.
Modificación de la macro de HPC_Execute
La siguiente macro es HPC_Execute. Recuerde que esta macro está diseñada para ejecutar el cálculo real o la lógica de negocios. Las entradas de esta función serán lo que se devuelva de la macro HPC_Partition en el último paso. Dado que acabamos de escribir la macro HPC_Partition , sabemos que las entradas de la macro HPC_Execute serán el número de fila y columna de la celda de tabla que queremos calcular.
El cuerpo de la macro HPC_Execute se copiará del código de la macro de cálculo original. Necesitaremos dos partes de este código: las declaraciones de variable en la parte superior y el código que ejecuta el bucle. Ya hemos usado la sección que trata con el tamaño de la tabla en la macro HPC_Initialize , por lo que no es necesario de nuevo, pero será más fácil copiar todo el bloque de código y, a continuación, quitar las partes que no necesitamos. A continuación, realizaremos algunos cambios para admitir el marco asincrónico.
Para modificar la macro de HPC_Execute
Vuelva a la macro original haciendo doble clic en el módulo "ScenarioAnalysis" en la ventana del proyecto de VBA.
Copie el código de la primera línea:
Dim Prem as double
Hasta la última línea:
Next cols
Vuelva al módulo HPCExcelMacros (haciendo doble clic en la ventana del proyecto de VBA) y pegue el código en la macro HPC_Execute .
En la macro HPC_Execute , elimine las líneas que ya hemos usado, empezando por:
' clear values, then figure out the table size
Hacia abajo hasta la línea justo antes:
' set up and run through the table
Compruebe que la macro HPC_Execute tiene este aspecto:
Public Function HPC_Execute(data As Variant) As Variant Dim Prem As Double Dim TempPIKdate As Date Dim TempPIKfreq As Double Dim rws As Integer Dim cols As Integer Dim Model As Integer ' set up and run through the table Call ReadSheetVariables TempPIKdate = PIKdate 'Save this value! TempPIKfreq = PIKfreq 'Save this value! Model = 1 If Range("PricingModel").Value2 = "Bond plus Option" Then Model = 2 End If For cols = 1 To NumCols For rws = 1 To NumRows Call ReadSheetVariables PIKdate = TempPIKdate PIKfreq = TempPIKfreq PIKrate = CDbl(Range("table1").Offset(rws, 0).Value) Prem = CDbl(Range("table1").Offset(0, cols).Value) If Prem = 0 Then End Ratio = CDbl(Face / Underlying / (1 + Prem)) Select Case Model Case 1 Range("cashtable").Cells(rws, cols).Value = … Case Else Range("cashtable").Cells(rws, cols).Value = … End Select Next rws Next cols End Function
Nota: En la macro ahora tenemos la parte de cálculo de la función, incluido el bucle que se ejecuta a través de cada celda de la tabla. Para el marco asincrónico, no queremos usar un bucle aquí; solo queremos calcular una sola celda. Recuerde que la macro HPC_Execute es código que se ejecutará en los nodos de proceso y se le proporcionará el número de fila y columna que queremos calcular.
Quite las líneas que componen el bucle (las líneas resaltadas a continuación):
Public Function HPC_Execute(data As Variant) As Variant Dim Prem As Double Dim TempPIKdate As Date Dim TempPIKfreq As Double Dim rws As Integer Dim cols As Integer Dim Model As Integer ' set up and run through the table Call ReadSheetVariables TempPIKdate = PIKdate 'Save this value! TempPIKfreq = PIKfreq 'Save this value! Model = 1 If Range("PricingModel").Value2 = "Bond plus Option" Then Model = 2 End If For cols = 1 To NumCols For rws = 1 To NumRows Call ReadSheetVariables PIKdate = TempPIKdate PIKfreq = TempPIKfreq PIKrate = CDbl(Range("table1").Offset(rws, 0).Value) Prem = CDbl(Range("table1").Offset(0, cols).Value) If Prem = 0 Then End Ratio = CDbl(Face / Underlying / (1 + Prem)) Select Case Model Case 1 Range("cashtable").Cells(rws, cols).Value = … Case Else Range("cashtable").Cells(rws, cols).Value = … End Select Next rws Next cols End Function
Reemplazar el bucle por el número de fila y columna que se pasan a la función. El código modificado debe tener este aspecto:
rws = data(0) cols = data(1) Call ReadSheetVariables PIKdate = TempPIKdate PIKfreq = TempPIKfreq PIKrate = CDbl(Range("table1").Offset(rws, 0).Value) Prem = CDbl(Range("table1").Offset(0, cols).Value) If Prem = 0 Then End Ratio = CDbl(Face / Underlying / (1 + Prem)) Select Case Model Case 1 Range("cashtable").Cells(rws, cols).Value = FullDiscountModel(360) / Face Case Else Range("cashtable").Cells(rws, cols).Value = BondPlusOptionModel(360) … End Select
En lugar del bucle , ahora estamos usando los valores de nuestra matriz de datos (la matriz que devolvimos de la macro HPC_Partition ), que contiene la fila y la columna de la celda que queremos calcular. Por lo tanto, para revisar ese último paso, hemos quitado las dos líneas de bucle,
For cols = 1 To NumCols
For rws = 1 To NumRows
así como las líneas "Next" al final del bucle,
Next rws
Next cols
y agregaron líneas justo encima del bucle para usar la variable Matriz de datos:
rws = data(0)
cols = data(1)
El último cambio que queremos realizar en la función HPC_Execute tiene que ver con la devolución de los datos. Recuerde que los datos se mueven a través de las macros, cada macro que pasa los resultados al siguiente. El código VBA original de este libro se diseñó para ejecutarse en el escritorio, por lo que, a medida que cada celda se calculó, el resultado se pegaba en la hoja de cálculo. Dado que este libro se va a ejecutar en el clúster, en lugar de pegar los resultados en la hoja de cálculo, es necesario recopilar el resultado del cálculo y devolverlo de la función.
Y hay otra cosa que debemos tener en cuenta: cuando la función HPC_Execute se ejecuta en un nodo de proceso, calculará el resultado de una celda determinada de la tabla. Este resultado se devolverá al escritorio y se enviará a la macro HPC_Merge . Pero recuerde que, en el marco asincrónico, los resultados se pueden devolver en cualquier orden, no necesariamente el mismo orden que los hemos enviado. Por lo tanto, es necesario indicar a la HPC_Merge macro qué celda de la tabla hemos calculado.
Podemos hacerlo mediante la inclusión del número de fila y columna en los datos de resultados. Al igual que con la macro HPC_Partition , podemos devolver una matriz de la macro HPC_Excecute. Esto permitirá que la función devuelva no solo el resultado, sino también la celda que se calculó.
De hecho, simplemente podemos volver a usar la misma matriz que se pasó a la función para devolver el resultado, ya que array ya contiene el número de fila y columna.
Para almacenar el resultado, cambie el código para que lea lo siguiente:
Select Case Model
Case 1
data(2) = FullDiscountModel(360) / Face
Case Else
data(2) = BondPlusOptionModel(360) / Face
End Select
HPC_Execute = data
Hemos cambiado el código que insertó valores en la hoja de cálculo para almacenar en su lugar los valores de resultado en la matriz de datos. Y la última línea usa la matriz de datos como valor devuelto de la función, por lo que los resultados (y los números de fila y columna) se enviarán a la siguiente macro.
Por lo tanto, el código final completo de la macro HPC_Execute debe tener este aspecto:
Public Function HPC_Execute(data As Variant) As Variant
Dim Prem As Double
Dim TempPIKdate As Date
Dim TempPIKfreq As Double
Dim rws As Integer
Dim cols As Integer
Dim Model As Integer
' set up and run through the table
Call ReadSheetVariables
TempPIKdate = PIKdate 'Save this value!
TempPIKfreq = PIKfreq 'Save this value!
Model = 1
If Range("PricingModel").Value2 = "Bond plus Option" Then
Model = 2
End If
rws = data(0)
cols = data(1)
Call ReadSheetVariables
PIKdate = TempPIKdate
PIKfreq = TempPIKfreq
PIKrate = CDbl(Range("table1").Offset(rws, 0).Value)
Prem = CDbl(Range("table1").Offset(0, cols).Value)
If Prem = 0 Then End
Ratio = CDbl(Face / Underlying / (1 + Prem))
Select Case Model
Case 1
data(2) = FullDiscountModel(360) / Face
Case Else
data(2) = BondPlusOptionModel(360) / Face
End Select
HPC_Execute = data
End Function
Modificación de la macro de HPC_Merge
La última macro que necesitamos modificar es la macro HPC_Merge . Recuerde que esta macro recibe un único resultado de cálculo del clúster. Queremos usarlo para insertar el resultado en la tabla.
La entrada para HPC_Merge va a ser lo que devuelvamos de HPC_Execute. Dado que acabamos de escribir la macro HPC_Execute , sabemos que el valor devuelto será una matriz que contiene el número de fila y columna y el resultado del cálculo. Para actualizar la tabla, podemos usar código de la macro original (este es el código que acabamos de cambiar en la función HPC_Execute ).
La línea de código original, en el módulo ScenarioAnalysis, tenía el siguiente aspecto:
Range("cashtable").Cells(rws, cols).Value = FullDiscountModel(360) / Face
Volveremos a escribir esa línea para usar los valores pasados a la macro en el parámetro de datos. La macro de HPC_Merge completada debe tener este aspecto:
Public Function HPC_Merge(data As Variant)
Range("cashtable").Cells(data(0), data(1)).Value = data(2)
' update the status bar with the counters
RcvRecords = RcvRecords + 1
UpdateStatus
End Function
Esta es la misma línea de código que se acaba de quitar de la macro HPC_Execute . Hemos reemplazado los valores de fila y columna (rws y cols en la línea original) por la fila y columna de la matriz. También hemos reemplazado la llamada de función por el resultado, que se almacena en la misma matriz.
Estas son todas las modificaciones que tenemos que realizar para ejecutar este libro en el clúster. Aunque puede parecer un montón de pasos, especialmente si esta es la primera vez que ha usado HPC Services para Excel, examine las macros para ver el código total que se cambió. Realmente no es mucho. En su mayor parte, esto implica copiar y pegar desde la macro original en las macros de HPC. Para admitir el cálculo asincrónico, hemos realizado una serie de cambios en el código, pero incluso eso era relativamente sencillo. No hemos realizado ningún cambio en la lógica de negocios real de este libro y ni siquiera tiene que entender las funciones de lógica de negocios para convertir el libro. Lo más importante es que, si los usuarios realizan cambios en la lógica de negocios en el futuro, no requerirá cambiar el cálculo del clúster.
Ejecución del libro
Para probar los cambios en el código, primero lo ejecutaremos en el escritorio. Como en el primer libro, agregaremos un nuevo botón a la hoja de cálculo y lo usaremos para ejecutar el cálculo. A continuación, especificaremos el nodo principal y el recurso compartido de archivos, agregaremos un botón que ejecute el libro en el clúster y, a continuación, ejecutaremos el libro en el clúster.
Adición de un botón que ejecuta el libro localmente
Para agregar un botón que ejecuta el libro localmente
(1) Con el libro de Excel abierto, haga clic en la pestaña Programador de la cinta de opciones.
(2) En la pestaña Programador , haga clic en Insertar y, a continuación, seleccione el control de botón - el primer control de la lista.
(3) Después de hacer clic en el botón, dibuje un rectángulo en algún lugar de la hoja de cálculo para insertar el botón en esa ubicación. Después de colocar el botón, aparece el cuadro de diálogo Asignar macro . !
(4) En el cuadro de diálogo, seleccione la macro CalculateWorkbookOnDesktop de la lista y haga clic en Aceptar. Asegúrese de seleccionar la macro de escritorio: queremos probar primero el libro y buscar los errores antes de ejecutarlo en el clúster.
(5) Haga clic con el botón derecho en el botón nuevo y, a continuación, seleccione Editar texto para cambiar la etiqueta.
(6) Asigne un nombre a la etiqueta "Desktop" o algo similar.
(7) Guarde el libro.
(8) Haga clic en el botón para ejecutar el libro en el escritorio.
Si hay algún error, verá un cuadro de diálogo de error y se resaltará la parte del código VBA con el error. Vuelva a comprobar el código enumerado anteriormente para resolver los errores.
Si no hay ningún error, verá que se rellena la tabla. Los valores deben ser los mismos que al hacer clic en el botón original de la hoja de cálculo. De nuevo, esto se ejecuta en el escritorio, por lo que debe ejecutarse aproximadamente la misma velocidad que el botón original, en algún lugar entre 1 y 2 minutos en la mayoría de las estaciones de trabajo.
Dado que estamos ejecutando con el código del marco de macros, también verá el progreso del cálculo que se muestra en la barra de estado de Excel. Al igual que con el primer libro, en ejecución en el escritorio verá que los números se mueven juntos, ya que en el escritorio el libro se ejecuta de forma sincrónica.
Ejecución del libro en el clúster
A continuación, intentaremos ejecutar el libro en el clúster. Para ello, primero es necesario establecer algunos valores para indicar a Excel cómo ponerse en contacto con el clúster. Estos valores se definen en el módulo HPCControlMacros **.** En la parte superior de este archivo, hay dos valores que deberá rellenar: el programador del clúster y el directorio de recursos compartidos. Recuerde que usted (el usuario de escritorio) debe tener acceso de escritura a este directorio de recursos compartidos; y los nodos de proceso del clúster deben tener acceso de lectura al directorio. En la mayoría de los casos, los cálculos del clúster se ejecutarán en la cuenta de usuario, pero es posible usar una cuenta de usuario diferente al conectarse a la sesión del clúster (más adelante en un momento).
Para especificar el nodo principal y el directorio de recursos compartidos
En la pestaña Programador de la cinta de opciones, haga clic en Visual Basic para abrir el editor de VBA.
En el editor de VBA, en el árbol del proyecto, haga doble clic en el módulo HPCControlMacros para abrir el archivo de macro.
Para el programador de clústeres, use el nombre del nodo principal del clúster; este es el nombre del equipo que usaría en la red. Puede usar un nombre completo (por ejemplo, headnode.mynetwork.com), pero no es necesario si está en el mismo dominio.
Para el directorio de recursos compartidos, use la ruta de acceso completa al directorio del recurso compartido que creó anteriormente (en la sección "Antes de empezar").
Ahora vuelva a la hoja de cálculo de Excel. Agregaremos otro botón, esta vez para ejecutar el cálculo en el clúster.
Para agregar un botón que ejecute el libro en el clúster
En la pestaña Programador , haga clic en Insertar y, a continuación, seleccione el control de botón , el primer control de la lista.
Después de hacer clic en el botón, dibuje un rectángulo en algún lugar de la hoja de cálculo para insertar el botón en esa ubicación. Después de colocar el botón, aparece el cuadro de diálogo Asignar macro .
En el cuadro de diálogo, seleccione la macro CalculateWorkbookOnCluster de la lista y, a continuación, haga clic en Aceptar.
Haga clic con el botón derecho en el botón nuevo y seleccione Editar texto para cambiar la etiqueta.
Asigne un nombre a la etiqueta "Cluster" o algo similar.
Guarde el libro.
Haga clic en el botón para ejecutar el libro en el clúster.
Si es la primera vez que ha ejecutado cualquier trabajo de clúster, ya sea mediante Excel o con cualquier otra aplicación, verá un cuadro de diálogo de autenticación de usuario. Escriba el nombre de usuario y la contraseña y, si lo desea, active la casilla para guardar sus credenciales. Si desea ejecutar cálculos en el clúster como un usuario diferente, puede especificar una configuración de cuenta de usuario diferente.
Nota: Asegúrese de que la cuenta de usuario (ya sea la cuenta de usuario estándar o lo que quiera usar) se designa como usuario de clúster en el Administrador de clústeres de HPC.
Si hay algún error, verá un cuadro de diálogo emergente. Si el cálculo del escritorio funcionó, los errores más probables en este momento tendrán que ver con la configuración que creó para el nodo principal del clúster y el directorio de recursos compartidos. Vuelva a comprobar esa configuración e inténtelo de nuevo.
Si no hay ningún error, verá el inicio del cálculo del clúster. En primer lugar, habrá una breve pausa, ya que la biblioteca cliente crea una sesión de HPC para el cálculo. A continuación, la biblioteca cliente llamará a la macro HPC_Initialize y verá que se borra la tabla. Si observa la barra de estado de Excel, verá que primero se envían todos los registros al clúster; el segundo número saltará hasta 105 (hay 105 celdas en la tabla). Después de eso, verá otra breve pausa antes de que se devuelvan los resultados. Esta pausa se produce cuando cada nodo de proceso inicia Excel y carga el libro.
Después de esta pausa, verá que los resultados comienzan a rellenar la tabla y la barra de estado comenzará a mostrar el número de resultados devueltos. Dado que se trata de un cálculo largo, es muy probable que vea los resultados devueltos fuera de orden; habrá espacios en blanco en la tabla, que luego se rellenarán. Una vez más, esto se debe a que el cálculo es asincrónico y algunos nodos de proceso calculan más rápido que otros. Finalmente, la tabla se rellenará completamente y la barra de estado mostrará el tiempo de cálculo.
Incluso si solo tiene dos nodos de proceso en el clúster de HPC, el cálculo debe ser mucho más rápido que ejecutarse en el escritorio. Si tiene cuatro nodos, ocho nodos o más, el cálculo debe ser extremadamente rápido. Siempre puede hacer clic en el botón "Escritorio" para comparar el rendimiento del cálculo del escritorio con el cálculo del clúster.
Procedimientos recomendados para libros de Excel de Cluster-Enabled
En la nota siguiente se describen algunas consideraciones importantes que debe tener en cuenta al diseñar libros de Excel para usarlos con HPC Services for Excel. Esta nota se aplica a los libros mediante el marco de macros de HPC/Excel que se ejecuta desde VBA o con la biblioteca ExcelClient de .NET.
Rendimiento de la aplicación de clúster
Al diseñar una aplicación para el cálculo en un clúster de HPC, normalmente se divide el trabajo necesario en tareas individuales y se envían esas tareas al clúster para su cálculo. Las ventajas de rendimiento del uso de HPC proceden de la paralelización, ya que muchos nodos de proceso funcionan al mismo tiempo.
Es responsabilidad del programador de HPC (el nodo principal) distribuir estas tareas a los nodos de proceso para su procesamiento. Sin embargo, para asegurarse de que los nodos de proceso nunca están esperando trabajo, debe intentar asegurarse de que HPC Scheduler siempre tiene una lista de tareas que se van a procesar. Si el Programador tiene que esperar a la siguiente tarea de procesamiento, uno o varios nodos de proceso se mantendrán inactivos (sin hacer nada) y no obtendrá el mejor uso del clúster de HPC.
Puede asegurarse de que scheduler y los nodos de proceso siempre tienen suficiente trabajo para hacerlo mediante el envío de solicitudes de cálculo lo más rápido posible. En el marco de macros de HPC/Excel, las solicitudes se envían con la macro HPC_Partition. Por lo tanto, es importante asegurarse de que la macro partition sea lo más rápida posible. Si puede diseñar la macro de partición para enviar tareas rápidamente, se asegurará de que el clúster está totalmente utilizado y obtendrá el mejor rendimiento posible de HPC.
Cuando se completan los cálculos individuales en los nodos de proceso del clúster, los resultados se devuelven a la aplicación de escritorio. En el marco de macros de HPC/Excel, los resultados se procesan mediante la macro HPC_Merge. También quiere hacer que esta macro sea lo más rápida posible, por dos motivos. En primer lugar, si la macro Merge es lenta para procesar los resultados, esto puede asociar innecesariamente los recursos del clúster. En segundo lugar, el procesamiento lento de los resultados ralentizará el cálculo general, lo que reduce las ventajas de usar HPC. Si se asegura de que la macro Merge procesa rápidamente los resultados, liberará los recursos del clúster para otro uso y mejorará la experiencia general del usuario.
Mejora del rendimiento de macros de HPC/Excel
En esta sección se describen algunos pasos que puede seguir para asegurarse de que los libros de Excel habilitados para HPC sean lo más eficaces posible, por lo que puede obtener el mejor rendimiento posible al ejecutar cálculos en un clúster de HPC.
Esta lista no es completa, pero puede encontrar algunas sugerencias que se aplican al libro. Y recuerde que son optimizaciones: el mejor enfoque al diseñar libros de Excel habilitados para HPC es diseñar primero el cálculo y mantenerlo lo más sencillo posible; después, una vez que el libro se ejecute correctamente en el clúster, realice el tipo de cambios que se describen aquí para mejorar el rendimiento general.
Evite abrir y cerrar recursos en las macros de partición y combinación.
Abrir y cerrar recursos externos ,como archivos de registro o conexiones de base de datos, puede tardar mucho tiempo y puede ralentizar las macros de partición y combinación. Además, debe evitar leer grandes conjuntos de datos en estas macros si es posible. Por ejemplo, no desea abrir una conexión de base de datos, buscar los registros y buscar un único registro para cada llamada a la macro Partition.
Un mejor enfoque consiste en abrir estos recursos una vez, en la macro Initialize y realizar los pasos de procesamiento iniciales. Por ejemplo, si necesita cargar un conjunto de datos grande desde una base de datos, cree la conexión de la base de datos y realice la consulta en la macro Initialize. A continuación, en la macro Partición, solo puede pasar al siguiente registro. Puede cerrar la conexión de base de datos en la macro Finalizar.
De forma similar, si está escribiendo en un archivo de registro en la macro Merge, considere la posibilidad de abrir el archivo en la macro Initialize. En la macro Combinar, puede escribir resultados de uno en uno y, a continuación, puede cerrar el archivo de registro en la macro Finalizar.
Evite recalcular la hoja de cálculo en la macro Combinar
Si va a insertar resultados en la hoja de cálculo de la macro Combinar, es posible que recalcule accidentalmente la hoja de cálculo; si la hoja de cálculo es muy complicada, esto puede ralentizar el procesamiento.
De forma predeterminada, Excel recalculará la hoja de cálculo cada vez que cambie el valor de una celda, incluido si actualiza la celda desde una macro de VBA. Excel recalculará solo las partes de la hoja de cálculo que se ven afectadas por el cambio, por lo que si la celda se encuentra por sí misma, esto no será significativo. Pero si la celda se usa como parte de un cálculo mayor o como datos del gráfico, la actualización puede ser lenta.
Si va a actualizar las celdas de hoja de cálculo de la macro Merge, considere la posibilidad de deshabilitar la actualización automática. Puede deshabilitar la actualización automática en la macro Initialize. A continuación, en la macro Finalizar, puede recalcular toda la hoja de cálculo y volver a habilitar el cálculo automático.
En la macro Initialize ( Inicializar), puede desactivar el cálculo automático con .
Application.Calculation = xlCalculationManual
A continuación, puede recalcular la hoja de cálculo y volver a habilitar el cálculo automático en la macro Finalizar con
Application.Calculate
Application.Calculation = xlCalculationAutomatic
Insertar bloques de datos en lugar de valores individuales
Al actualizar las celdas de hoja de cálculo de VBA, esto implica una serie de pasos internos y puede ser más lento de lo esperado. Casi siempre es mejor cambiar varias celdas como un solo bloque, en lugar de uno a uno.
Si la macro Execute devuelve un gran número de valores( una matriz de 100 números, por ejemplo, hay dos maneras de insertar estos datos en la hoja de cálculo. Puede insertarlos de uno en uno, en un bucle:
For i = 1 To 100 Step 1
Cells(1, i).Value2 = v(i)
Next i
O bien, puede insertar el intervalo completo como una matriz:
Range(Cells(2, 1), Cells(2, 100)).Value2 = v
La inserción de una celda tarda aproximadamente la misma cantidad de tiempo que la inserción de un bloque de celdas. Por lo tanto, si tiene una matriz de 100 valores, la primera forma de hacerlo, insertar celdas una a la vez en un bucle, puede tardar hasta 100 veces en el segundo enfoque, insertando el bloque de celdas como una matriz.
Desactivar las actualizaciones de pantalla
Si va a realizar cambios en la hoja de cálculo de la macro Combinar (si está actualizando celdas o cambiando los datos del gráfico), desactivar las actualizaciones de pantalla puede reducir el tiempo de procesamiento. Esto funciona porque Excel consume algún tiempo actualizando la pantalla y la interfaz de usuario.
Puede deshabilitar las actualizaciones de pantalla en la macro Inicializar y volver a habilitar las actualizaciones de pantalla en la macro Finalizar. En la macro Initialize (Inicializar), use
Application.ScreenUpdating = False
En la macro Finalizar, use
Application.ScreenUpdating = True
Esto deshabilitará las actualizaciones de pantalla durante el cálculo y volverá a habilitar las actualizaciones una vez completado el cálculo. Al volver a habilitar las actualizaciones de pantalla en la macro Finalizar, Excel actualizará automáticamente la pantalla.
Uso de estructuras de datos para almacenar temporalmente información en la memoria
Si la recopilación de información para el procesamiento (lo que se hace en la macro de partición) es muy lenta o si necesita realizar un procesamiento posterior muy complejo de los resultados, en la macro Combinar, considere la posibilidad de usar estructuras de datos para almacenar información en la memoria durante el cálculo.
Por ejemplo, si cada una de las solicitudes de cálculo de la macro Partition requiere una consulta de base de datos muy complicada, esto puede ralentizar el procesamiento y dar lugar a un rendimiento deficiente. En este caso, puede ser una buena idea realizar este procesamiento complejo en la macro Initialize antes de que se inicie el cálculo.
Si realiza este procesamiento complejo en la macro Initialize, puede almacenar cada una de las solicitudes de cálculo en una estructura de datos de VBA, como una matriz de variantes. A continuación, en la macro Partición, simplemente puede devolver la siguiente entrada en la matriz. Esto ayudará a garantizar que la macro Partition sea lo más rápida posible.
Del mismo modo, si debe realizar un procesamiento posterior muy complejo a los resultados a medida que llegan, puede ser aconsejable almacenar los resultados en una estructura de datos en la macro Combinar y, a continuación, procesar los resultados en la macro Finalizar una vez completado el cálculo.
Por ejemplo, si almacena resultados en una base de datos, pero cada escritura de base de datos requiere una instrucción insert compleja, puede ser mejor mover este procesamiento a la macro Finalizar. Puede crear una estructura de datos (como una matriz de variantes) y, en la macro Combinar, simplemente inserte cada resultado en la matriz. A continuación, en la macro Finalizar, puede recorrer la matriz y realizar las operaciones de escritura de base de datos necesarias a la vez.
Notas finales
Convertir un libro existente para usar HPC Services para Excel es más de un arte y, a continuación, una ciencia. Los detalles específicos (qué código se va a mover y dónde moverlo) dependerán siempre del libro concreto.
Sin embargo, ahora debería comprender los conceptos implicados y comprender por qué usamos el marco de macro asincrónico. Para convertir cualquier libro para usar HPC Services para Excel, es necesario crear un cálculo paralelo de la misma manera: agregar las funciones del marco de macros al libro y rellenar el código adecuado.
Puede usar los archivos de macro "esqueleto" incluidos en este artículo en sus propios libros. Siga los pasos que usó en los ejemplos anteriores para identificar el código iterativo del libro y moverlo a las macros adecuadas. Y recuerde probar el cálculo en el escritorio para identificar los errores antes de ejecutar cálculos en el clúster.
También debe tener una idea de las ventajas de rendimiento que puede obtener al ejecutar libros de Excel en un clúster de HPC con HPC Services for Excel. En este artículo empezamos con un libro que ya era razonablemente rápido, para calcular todo el libro solo tardó unos 1 a 2 minutos en el escritorio. Pero incluso ese libro podría ejecutarse dos veces más rápido, cuatro veces más rápido o más rápido, en un clúster de HPC. El rendimiento real depende del número de nodos de proceso disponibles en el clúster y siempre puede mejorar el rendimiento agregando más nodos de proceso al clúster.
Con una cantidad relativamente pequeña de trabajo, es posible convertir muchos libros de Excel de ejecución prolongada para que se ejecuten en un clúster de Microsoft HPC con HPC Services para Excel. Y para libros de larga duración (libros de larga duración), libros que tardan horas o incluso días en calcularse, el uso de HPC Services para Excel puede dar lugar a una mejora realmente dramática del rendimiento.