<< Chapter < Page Chapter >> Page >

La rutina SENDCELL encuentra una celda en particular, y la imprime en el proceso maestro. Esta rutina se invoca en un estilo SPMD : todos los procesos entran en ella, si bien no necesariamente al mismo tiempo. Dependiendo del INUM y de la celda que estemos observando, cada proceso puede hacer algo diferente.

Si la celda en cuestión está en el proceso maestro, y nosotros somos el proceso maestro, imprimimos. Ninguno de los demás procesos hace algo. Si la celda en cuestión está almacenada en otro proceso, aquél que la contenga la envía al proceso maestro. El proceso maestro recibe el valor y lo imprime. El resto de los procesos no hacen nada.

Se tata de un ejemplo simple de un código con un estilo típicamente SPMD. Todos los procesos ejecutan el codigo aproximadamente al mismo tiempo, pero en base a la información local de cada proceso, las acciones realizadas por los diferentes procesos pueden ser muy distintas:


SUBROUTINE SENDCELL(RED,ROWS,COLS,OFFSET,MYLEN,INUM,PTID,R,C) INCLUDE ’../include/fpvm3.h’INTEGER ROWS,COLS,OFFSET,MYLEN,INUM,PTID,R,C REAL*8 RED(0:ROWS+1,0:COLS+1)REAL*8 CENTER* Calculamos el número de renglón local, para determinar si es nuestro I = C - OFFSETIF ( I .GE. 1 .AND. I.LE. MYLEN ) THEN IF ( INUM .EQ. 0 ) THENPRINT *,’Master has’, RED(R,I), R, C, I ELSECALL PVMFINITSEND(PVMDEFAULT,TRUE) CALL PVMFPACK( REAL8, RED(R,I), 1, 1, INFO )PRINT *, ’INUM:’,INUM,’ Returning’,R,C,RED(R,I),I CALL PVMFSEND( PTID, 3, INFO )ENDIF ELSEIF ( INUM .EQ. 0 ) THEN CALL PVMFRECV( -1 , 3, BUFID )CALL PVMFUNPACK ( REAL8, CENTER, 1, 1, INFO) PRINT *, ’Master Received’,R,C,CENTERENDIF ENDIFRETURN END

Como la rutina previa, todos los procesos ejecutan la rutina STORE . La idea es almacenar un valor en una posición de renglón y columna global . Primero, debemos determinar si la celda está en nuestro proceso. Si es así, debemos calcular la columna local (I) en nuestro subconjunto de la matriz global, y luego almacenar el valor:


SUBROUTINE STORE(RED,ROWS,COLS,OFFSET,MYLEN,R,C,VALUE,INUM) REAL*8 RED(0:ROWS+1,0:COLS+1)REAL VALUE INTEGER ROWS,COLS,OFFSET,MYLEN,R,C,I,INUMI = C - OFFSET IF ( I .LT. 1 .OR. I .GT. MYLEN ) RETURNRED(R,I) = VALUE RETURNEND

Cuando se ejecuta este programa, proporciona la siguiente salida:


% pheat INUM: 0 Local 1 50 Global 1 50El maestro recibió 100 100 3.4722390023541D-07 %

Vemos do líneas de impresión. La primera indica los valores que el Proceso 0 usó en su cálculo de geometría. La segunda es la salida del proceso maestro con la temperatura de la celda (100,100), tras 200 ciclos de tiempo.

Una técnica interesante, que resulta útil para depurar este tipo de programa, es cambiar el número de procesos creados. Si el programa no está moviendo sus datos apropiadamente, usualmente obtendrá usted distintos resultados cuando use distinto número de procesos. Si lo observa detalladamente, notará que el código anterior funciona correctamente de 1 a 30 procesos.

Observe que no hay una operación de barrera al final de cada ciclo de tiempo. Ello contrasta con la forma en que operan los ciclos paralelos en los multiprocesadores con acceso a uniforme a memoria compartida, que fuerzan una barrera al final de cada ciclo. Dado que hemos puesto como regla que "el dueño calcule", y que nada se calcule hasta que se hayan recibido todos los datos fantasma, no hay necesidad de tal barrera. El receptor de los mensajes con los valores fantasmas apropiados permite a un proceso comenzar a calcular de inmediato, sin importar lo que los otros procesos estén realizando en ese momento.

Este ejemplo puede usarse ya sea como un marco de trabajo para desarrollar otros cálculos basados en retículas, o como una buena excusa para usar HPF y apreciar el arduo trabajo llevado a cabo por los creadores de compiladores HPF. Una implementación bien hecha de esta simulación en HPF debe presentar mejor rendimiento que la implementación PVM, porque HPF puede llevar a cabo optimizaciones más estrictas. Al contrario que nosotros, el compilador HPF no tiene por qué hacer que sea fácilmente legible el código que genera.

Pvm summary

PVM es una herramienta ampliamente usada, porque proporciona portabilidad a lo largo de cualquier arquitectura diferente de la SIMD. Una vez realizado el esfuerzo de hacer que un código use paso de mensajes, tiende a ejecutarse bien en muchas arquitecturas distintas.

Las principales preocupaciones cuando se usa PVM son:

  • La necesidad de una etapa de empaquetamiento, separada de la etapa de envío.
  • El hecho de que esté diseñado para trabajar en un ambiente heterogéneo, puede implicar cierto nivel de sobrecarga
  • No lleva cabo de manera automática tareas comunes como los cálculos geométricos

Pero a pesar de todo, para cierto conjunto de programadores, PVM es la herramienta a usarse. Si desea usted aprender más acerca de PVM vea PVM — A User’s Guide and Tutorial for Networked Parallel Computing , de Al Geist, Adam Beguelin, Jack Dongarra, Weicheng Jiang, Robert Manchek, y Vaidy Sunderam (MIT Press). Hay información disponible acerca de ello en www.netlib.org/pvm3/ .

Get Jobilize Job Search Mobile App in your pocket Now!

Get it on Google Play Download on the App Store Now




Source:  OpenStax, Cómputo de alto rendimiento. OpenStax CNX. Sep 02, 2011 Download for free at http://cnx.org/content/col11356/1.2
Google Play and the Google Play logo are trademarks of Google Inc.

Notification Switch

Would you like to follow the 'Cómputo de alto rendimiento' conversation and receive update notifications?

Ask