oculta:
Celestt Rosellé Balanya
Ricardo Pefia Mari
Departamento de Programacién de Computadores
Facultad de Informatica de Barcelona
Celesti Rosellé es profesor colaborador de la Facultad de Informética de Barcelona. Sus trabajos se
centran, principalmente, en la metodologia de la programacién y su aplicacién a la paralelizacién de algorit-
‘mos para grificos. Actualmente esti realizando, en esa linea, su tesis doctoral.
Ricardo Petia es profesor titular de 1a Facultad de Informética de Barcelona. Su interés investigador se
centra en la metodologia de la programacién y en los gréficos por computador. Ha trabajado varios afios en la
empresa privada desarrollando programas en gran escala en las areas de telefonia y CAD/CAM.
Se presenta una notacién algoritmica para programacién paralela en la
que la recursividad y la introduccion gradual del paralelismo juegan un papel
importante. Se aplica dicha notacién a la presentacion de una versién paralela
del algoritmo de Warnock para eliminar superficies ocultas. Finalmente, se
discuten cuestiones de implementacién.
L_Introduccion
Este trabajo se encuadra en una investigacién més amplia cuyo objetivo es expresar
en forma paralela los algoritmos més frecuentes utilizados en las aplicaciones gréficas. En
particular, aquellos que consumen mis tiempo de proceso: recorte de lineas y paneles, elimi-
nacién de partes ocultas, iluminacién, etc.
La estrategia tradicional para aumentar la eficiencia de los algoritmos gréficos, ha sido
la emigracién al hardware de las funciones de mds bajo nivel, dando lugar, en muchos
casos, al desarrollo de circuitos integrados que se incorporan directamente a los periféricos
grdficos. Ejemplos de tales pastillas son:
+ conversién de lineas y paneles a puntos [Abram y Fuchs 1984, Ikedo 1984]
+ memorias de refresco con capacidad de célculo [Fuchs y Poulton 1981]
+ operaciones con bits, en memorias de refresco [Atwood 1984]
+ transformacién 3D, recorte 3D y proyeccién [Clark 1982]
GR14 721Las arquitecturas asf construidas resultan altamente eficientes, pero también de eleva-
do coste. Los algoritmos han de especializarse mucho para su adaptaci6n al hardware y, una
vez incorporados al mismo, su modificacién implica el redisetio del circuito. Estos circuitos,
a menudo capaces de procesar en paralelo, s6lo sirven para ejecutar un algoritmo. Por otra
parte, los algoritmos de muy alto nivel —eliminacién de partes ocultas, iluminaci6n— s6lo
pueden ser incorporados al hardware a unos costes elevadisimos y estén justificados en un
niimero reducido de aplicaciones: simuladores de vuelo, animacién en tiempo real, etc.
En contraste con esta estrategia, el propésito que aqui se persigue es ganar en flexibi-
lidad a costa de perder algo en eficiencia. Se pretende expresar diferentes algoritmos en una
notacién paralela comin, mds o menos convencional, que pueda ser ejecutada en arquitec-
turas paralelas de propésito general. De este modo, una misma arquitectura no especializada
y, por tanto, de coste razonable, ser4 capaz de ejecutar diferentes algoritmos. Un tipo de
lenguajes y arquitecturas cercanas a este planteamiento son: el lenguaje Ada [Ada 1981], el
lenguaje Occam [Inmos 1984, Jones 1985] y las arquitecturas basadas en los rransputers
[Withby-Stevens 1985].
Algoritmos candidatos para ser expresados en esta notacién y ejecutados en paralelo
con ganancia apreciable, son aquellos demasiado sofisticados para que sea facil su incorpo-
raci6n al hardware y, a la vez, cuyo tiempo de ejecucién en versin secuencial, se mida en
decenas de segundos o de minutos. En esta categoria caen, sin duda, los de eliminacién de
partes ocultas y los de obtencién de escenas con alto grado de realismo (trazado de rayos,
tratamiento de texturas, fractales, etc.). Un ejemplo interesante de algoritmo paralelo de tra-
zado de rayos puede verse en [Clearly et al. 1986].
Un objetivo complementario es investigar la estructura de los algoritmos paralelos
conseguidos, y tratar de establecer la base para una metodologia de paralelizacién de algorit-
mos, tanto dentro como fuera del drea de gréficos, El estudio de la eficiencia paralela de los
algoritmos, esto es, de la eficiencia global teniendo en cuenta el ntimero de procesadores
disponibles, serd un aspecto més a estudiar.
Constitzyen también objetivos colaterales :
+ el desarrollo de una notacién algoritmica paralela, fiable desde el punto de vista de
la programacién y suficientemente expresiva, que obvie algunos de los inconve-
nientes y limitaciones de los lenguajes paralelos disponibles actualmente.
722 GR14+ el estudio de arquitecturas multiprocesador de propésito “general” (en el sentido de
que sean aptas para una familia amplia de algoritmos), que soporten, con una
eficiencia razonable, los algoritmos propuestos.
En el siguiente apartado se describe la versién secuencial del algoritmo de Wamock
[Warnock 1969] para la eliminacién de superficies ocultas y se justifica su eleccién como
algoritmo candidato a ser paralelizado. En el apartado 3 se introduce y justifica brevemente
la notaci6n paralela empleada posteriormente. Esta propuesta no ha de entenderse‘como defi-
nitiva, aunque sf es bastante ilustrativa del tipo de construcciones que los autores consideran
interesantes para ser incluidas en un lenguaje paralelo. El apartado 4 describe la versin pa-
ralela del algoritmo de Warnock expresada en la notaci6n del apartado anterior. Se realiza un
estudio de su eficiencia, compardndola con la de la versién secuencial. El siguiente apartado
estudia cuestiones de implementacién asociadas, tanto a la notacién paralela, como al algorit-
mo paralelo descrito.
2. Algoritmo secuencial de eliminacin de partes ocultas
Se ha escogido el algoritmo de Warnock, 0 algoritmo de subdivisién de 4reas, porque
se trata de una aplicacién del esquema divide and conquer, que conduce de una manera muy
directa a una solucién paralela.
El esquema divide and conquer [Veloso 1980] es usado frecuentemente para resolver
problemas cuya solucién puede expresarse en términos de ella misma. El método es el si-
guiente:
+ siel problema a resolver es suficientemente simple, se resuelve directamente.
+ si el problema a resolver es complejo, se descompone en dos o més subproblemas
del mismo tipo que el original, que se resuelven independientemente. El resultado
del problema complejo se obtiene combinando adecuadamente los resultados parcia-
les que cada subproblema ha producido.
Los métodos Quicksort y Mergesort de ordenacién de vectores 0 el problema de las
Torres de Hanoi son ejemplos tipicos de la aplicacién del esquema divide and conquer
[Horowitz y Sahni 1978]. En muchos casos no importa el orden de resolucién de los
GR14 723distintos subproblemas (el problema de las Torres de Hanoi es una excepei6n) y, en conse-
cuencia, pueden resolverse en paralelo. Un ejemplo de implementacién paralela del algorit-
mo Mergesort realizada en el lenguaje Occam puede encontrarse en [Jones 1985}.
Elalgoritmo de Warnock.
Pertenece a la clase de algoritmos de eliminacién de partes ocultas que trabajan en es-
Pacio imagen. Se basa en la coherencia de las éreas que componen la imagen, pues ésta no
cambia mucho de un pixel al pixel vecino y, por tanto, hay grandes porciones de la imagen
que son del mismo color.
Dada una lista de caras (poligonos) que componen la imagen y la ventana en la que
hay que dibujarlas, el algoritmo intenta determinar si el contenido de la ventana es suficiente-
mente simple. Si lo es, la dibuja, es decir, calcula el color de cada pixel de la ventana. Si la
ventana no es simple, la subdivide en ventanas més pequetias a las que aplica el mismo pro-
cedimiento.
No hay un algoritmo de Warnock tinico sino una coleccién de ellos. De hecho hay
uno para cada significado de “ventana simple” y para cada método de subdivision de venta-
nas no simples.
Para establecer un criterio de decisién del significado de “ventana simple” hay que
considerar las maneras en que un polfgono puede estar colocado Tespecto a una ventana.
Hay tres clases de poligonos:
* disjuntos: si la interseccién del poligono con la ventana es vacta,
* envolventes: si la ventana est4 totalmente contenida dentro del poligono.
* otros: que intersectan con la ventana o est4n totalmente contenidos en ella.
Todo pol{gono disjunto de una ventana lo es también de cualquier posible subventa-
na. Asimismo, todo polfgono que envuelve una ventana, envuelve a cualquier posible sub-
ventana. Ademds, un poligono envolvente oculta todos los polfgonos que estén més lejos
que él, independientemente de la clase a la que pertenezcan.
E] algoritmo clasifica los poligonos segiin la ventana en una de las tres clases posi-
bles y prescinde de los poligonos disjuntos y de los poligonos ocultos por cualquier envol-
724 GR14vente, pues no afectan a la porcién de imagen que se ve desde la ventana. Esta clasificacion
produce automdticamente una definicién de las situaciones que pueden ser consideradas
simples:
* todos los polfgonos han sido eliminados por lo que la ventana est vacfa.
* queda un solo poligono ya sea envolvente, intersector 0 contenido.
Para evitar mas subdivisiones de las necesarias también se consideran simples las
ventanas del tamafio de detalle deseado, es decir, las de tamatio pixel. En este caso el color
del pixel se toma igual al del polfgono més cercano segtin el centro de la ventana-pixel, 0
bien, se aplica alguno de los métodos de antialiasing para decidir el color.
Un algoritmo de Wamock toma, en la notacién Merlin [Botella y otros 1982], la for-
ma siguiente:
accion warnock( Ip es lista_poligonos; v es ventana) es
var
simple es booleano
tvar
clasiticar( Ip, v, simple);
opcion
caso simple hacer dibujar( Ip, v)
caso —simple hacer
wamock( Ip, sub_ventana_1( v));
wamock( Ip, sub_ventana_2{ v));
warnock( Ip, sub_ventana_3( v)):
warnock( Ip, sub_ventana_4( v))
fopcion
faccion
donde clasificar elimina de la lista Ip los poligonos ocultos o disjuntos y devuelve el valor
booleano simple. La accién dibujar se ocupa de pintar las ventanas simples. Las funciones
sub_ventana_1 a sub_ventana_4 devuelven, para una ventana dada, las subventanas en las
que se divide. Se ha tomado la decisi6n de dividir cada ventana en cuatro subventanas igua-
les, tal como en el trabajo original (Wamock 1969]. De hecho, una ventana se puede subdi-
vidir en cualquier nimero de subventanas de cualquier forma con tal que sean disjuntas dos
a dos y la cubran por completo.
Versién iterativa.
El algoritmo presentado no es muy eficiente desde el punto de vista del paso de pa-
rémetros. Tal como estd requiere la copia de la lista de poligonos en cada activacién de la
GR14 725accién wamock. Es para evitar esta ineficiencia que la implementacién habitual del algoritmo
¢s iterativa en vez de recursiva. En lugar de una lista de polfgonos se manejan tres: una de
poligonos disjuntos id, una de poligonos envolventes le y una con los poligonos restantes Ir,
junto con una pila en la que se depositan las ventanas a procesar.
Cada iteracién mueve los poligonos de la lista Ir a las listas le o Id seguin sean envol-
ventes o disjuntos para la ventana en curso y recuerda el nivel de subdivisién en el que han
sido movidos, para poder devolverlos a la lista correspondiente cuando la ventaria en curso
y todas las subventanas a que pueda dar lugar hayan sido procesadas.
Estudio de la eficiencia.
El caso peor para el algoritmo de Warnock se da cuando todas las ventanas son com-
plejas y hay que subdividirlas siempre hasta llegar a la ventana de tamaiio pixel. El estudio
se realiza para ventanas cuadradas y suponiendo que el tiempo necesario para procesar un
poligono es constante. Sea N la medida en pixels del lado de la ventana y n el nimero de
poligonos. Si la ventana es un pixel entonces N = 1 y el algoritmo tarda un tiempo propor-
cional al nimero de polfgonos. Si la ventana no es pixel, hay que clasificar los polfgonos y
procesar las cuatro subventanas a que da lugar. El coste del algoritmo queda establecido por
la siguiente recurrencia:
bin siN=1
T(N, n) =
4.T( N/2, n) +b"n siN>1
La soluci6n de esta recurrencia es: T( N, n) € O( n.N2).
En el caso més realista en el que el mimero de polfgonos a considerar disminuye con
el tamafio de la ventana, la recurrencia es la siguiente:
bin siN=1
T(N, 1) =
4.7( N/2, nc) + b".n siN>1
siendo c el factor de disminucién. La solucién de esta recurrencia es:
T(N, n) € Of nist) ) sitse<4
T(N, A) € O( nlogN ) sica4
726 GR143._Notacién paralela
La notacién propuesta se concibe como una extensién de la notacién algoritmica
Merlin (Botella y otros 1982], desarrollada en la Facultad de Informética de Barcelona con
fines fundamentalmente docentes. Las caracteristicas més destacables de Merlin son :
* notacién en lengua nativa (existe una versién catalana y otra castellana).
+ inspirdda en la notacién MEFIA [Scholl et al. 1978] y en el lenguaje Ada [Ada
1981].
* concepto central: tipos abstractos de datos.
Los conceptos adicionales introducidos son los siguientes:
* procesos
* sentencia paralela
*canales
+ sentencia altemativa generalizada
Procesos
Un proceso es una actividad secuencial que puede ejecutarse en paralelo con otros
procesos. Un programa paralelo se define inicialmente como un solo proceso que, a lo lar-
go de su ejecucién, puede activar otros procesos. La sintaxis para la declaracién de un pro-
ceso es la siguiente:
proceso «nombre» (.parametros formales»)
{proceso
El entorno que activa el proceso es responsable de establecer el valor actual de los
pardmetros para esa activacién. Los pardmetros pueden ser de entrada o de salida. Este ilti-
mo caso se indica incluyendo la palabra clave sal delante de la declaracién del tipo del paré-
metro. Un proceso sélo tiene acceso a sus pardmetros y a sus variables locales. La activa-
cién de un proceso se realiza mediante la sentencia ejecutable:
proceso (.parémetros actuales n-)
fparalelo
El proceso que contiene la sentencia queda detenido temporalmente. Se produce la
transferencia de valores de entrada a los parémetros formales de entrada de cada proceso. Se
inicia la ejecucién en paralelo de los mismos. Cuando un proceso termina, se realiza la trans-
ferencia de valores de salida a los parémetros actuales correspondientes. Si todos terminan,
se reanuda la ejecucién del proceso llamante a continuacién de esta sentencia.
Un mismo parémetro actual de entrada puede figurar en mAs de una activacién de
Proceso. Los pardmetros actuales de salida han de ser necesariamente disjuntos.
Se suministra también una versién con replicador de la sentencia paralela, en la que se
pueden activar varias instancias de un mismo proceso. La variable de control del replicador
puede utilizarse como pardmetro actual para distinguir, si es necesario, una instancia de otra.
Su sintaxis es:
Paralelo «variable» en -expresién 1» :
Proceso «nombre: (.parémetros actuales»)
fparalelo
La variable de control del replicador ha de ser entera. Tanto «expresién 1» como
cexpresion 2» se calculan en tiempo de ejecucién. Ei niimero de instancias activadas —que es
la diferencia entre ambas mas uno- no es posible determinarlo en tiempo de compilaci6n.
728 GR14Canales
Un canal c es una variable de un tipo genérico del lenguaje, que tiene asociadas las
siguientes caracteristicas:
+ hay que declarar explicitamente el ntimero y tipo de los valores que pueden trans-
mitirse por el mismo. Se hace mediante sentencias declarativas de tipo y de varia-
ble:
tipo «nombre: es canal (:parametros formales+);
var ces «nombre» fvar
Se pueden crear estructuras (vectores, tuplas, ... ) compuestas s6lo de canales.
+ admite inicamente dos operaciones, una para escribir valores en el canal y otra para
Ieerlos. Los valores han de coincidir en nimero y tipo con la declaracién del canal.
La sintaxis empleada es:
c.eseribir («valores actuales»)
cleer («variables actuales»)
* un canal tiene dos extremos, uno de escritura y otro de lectura. Un proceso puede
escribir o leer s6lo de los canales que le son pasados cémo pardmetros en su acti-
vacién. La declaracién del parametro formal especifica si se trata del extremo de es-
critura 0 del de lectura:
proceso «nombre: (...;¢ es lectura «tipo de canal;
proceso «nombre: (...; ¢ es escritura ‘tipo de canab
El compilador debe asegurar que un canal es pasado como pardmetro al menos a dos
procesos y que, al menos uno, recibe el extremo de lectura y, al menos otro, el de escritura.
Un pardmetro de tipo canal puede, a su vez, ser transmitido a otros procesos activados des-
de uno dado, pero no se puede cambiar la cualificacién del extremo. Si un mismo extremo
es pasado como pardmetro a varios procesos de una sentencia paralela, se dice que el extre-
mo se ha desdoblado.
Estas reglas aseguran que los canales pueden utilizarse para comunicar procesos
“hermanos” de una sentencia paralela, o un miembro de una sentencia paralela con los
GR14 729“descendientes” de sus hermanos, pero nunca podré comunicar entre s{ a un proceso con
sus descendientes a cualquier nivel.
Un canal asegura la sincronizacién y comunicacién entre un proceso escritor y un
Proceso lector del mismo. Si no est4 disponible uno de los dos, el otro partenaire queda a la
espera. Si hay mds de un proceso disponible en un mismo extremo, s6lo uno logrard sincro-
nizarse, siendo la eleccién no determinista.
Sentencia alternariva generalizada
En Merlin existe una forma de sentencia alternativa que permite elegir entre varias
opciones disjuntas:
opcion
caso B, hacer S,;
Las expresiones booleanas B, deben ser exclusivas: no puede haber dos expresiones
ciertas a la vez.
Se propone mantener como sentencia alternativa de la notacion paralela, la sentencia
opcion...fopcion de Merlin con las siguientes modificaciones:
+ mas de una B; puede ser cierta al tiempo. La eleccién de qué rama se ejecuta es no
determinista.
+ Las B, pueden estar formadas por:
una expresién booleana, 6
—una operacién de lectura o de escritura sobre un canal, 6
—una expresién booleana seguida de “:” y de una operacién de lectura o de
escritura.
Cada rama de la sentencia, “protegida” por una expresién booleana y/o una opera-
cién sobre un canal, se denomina accién protegida.
730 GR14La sentencia alternativa generalizada se ejecuta del siguiente modo:
« se evaliian todas las expresiones booleanas. Si, en algiin caso, no existe, se inter-
pretar4 como la constante booleana cierto. Las acciones protegidas cuya expresién
booleana es cierta se dice que estan abiertas.
+ Las acciones protegidas abiertas que no tengan operacién sobre un canal, son ya
clegibles para ejecucién. Las que la tengan, son elegibles si existe un proceso en el
otro extremo del canal dispuesto a ejecutar la operacién complementaria.
+ Si existe mds de una acci6n protegida elegible, se ejecutard una de ellas arbitraria-
mente. Si todas las acciones abiertas tienen operaciones sobre canales cuyos extre-
mos opuestos no estén disponibles, 1a sentencia deja el proceso a la espera hasta
que sean posibles una o més sincronizaciones. Si no existe ninguna accién protegi-
da abierta, la sentencia aborta.
No se considera necesaria la creacién de una sentencia repetitiva especial puesto que
pueden utilizarse las sentencias ya previstas en Merlin, Por ejemplo, si se pretende expresar
una repeticién sin fin de una sentencia altemnativa, se podria escribir:
mientras cierto hacer
opcién
fopcién
{mientras
Si se quisiera expresar una repetici6n hasta que todas las protecciones booleanas de la
sentencia alternativa sean falsas, se escribiria:
mientras B, v ..v 8, hacer
opcién
caso B, ...
caso B, ...
fopcién
fmientras
GR14 731se ha de iluminar cada pixel,
Proceso eliminar_partes_ocultas( Ip es lista_poligonos: v es ventana) es
tipo canal_puntos es canal (jes 1:N; col es color)
var
Ces canal_puntos
tvar
Paralelo
Proceso warnock( Ip, v, c)
Proceso almacenar_imagen( c)
fparalelo
fproceso
Proceso almacenar_imagen( c es lectura canal_puntos) es
var
i,j, k, pixels es entero; col es color:
Memoria_imagen es vector [ 1:N, 1:N] de color
tvar
k:= 0; npixels := N°N:
mientras k < npixels hacer
c.leer col);
‘memoria_imagent i J -= col;
K:=ket
fmientras
fproceso
paralela de la misma:
Preceso warnock( Ip es lista_poligonos; v es ventana: c es escritura canal_puntos) es
var
simple es booleano
fvar
clasiticar( Ip, v, simple);
opcion
caso simple hacer dibujar( Ip, v, c)
€aso — simple hacer paralelo
Proceso wamock( Ip, su_ventana_1( v), c)
Proceso wamock( Ip, sub_ventana_2{ v), c)
Proceso wamock( Ip, sub_ventana_a{ v), c)
Proceso wamock( Ip, sub_ventana_4{ v). c)
fparalelo
fopcion
fproceso
732 GR14La accién dibujar efectia una operacién c.eseribir( i, j, col) para cada pixel de la
ventana v.
Eficiencia de la versién paralela.
Se va a calcular el coste de la versién paralela en dos casos: el de tener suficientes
procesadores para todas las activaciones posibles y el de tener no més de p procesadores.
En el primer caso la recurrencia que nos permite calcular el coste es:
bin siN=1
T(N, n) =
T(.N/2, n/c) +b". siN>1
que es la misma que en el caso secuencial pero teniendo en cuenta que los cuatro subproble-
mas se resuelven en paralelo. El coste del algoritmo paralelo es, pues:
T(N, n) € O( n.logN ) sic=1
T(N,n) € O(n) sic>1
Para el caso de p procesadores el coste se calcularé de la manera siguiente: mientras
haya suficientes procesadores se asignard cada nuevo proceso a un nuevo procesador; en
cuanto haya menos procesadores que procesos, éstos se repartiran por igual entre aquellos.
En dfinitiva, el coste serd el del algoritmo paralelo mientras haya suficientes procesadores,
pero, desde ese instante el coste ser como el del algoritmo secuencial trabajando en un pro-
blema més pequefio.
Supongamos que p = 4X. Entonces, hasta el nivel k-ésimo de subdivisi6n el coste seré
el paralelo con N = 2, pues podemos asignar a cada proceso un procesador. A partir de en-
tonces cada procesador pasar4 a ocuparse de todos los subproblemas que genere la ventana
que le ha tocado y el coste ser el del algoritmo secuencial pero, en vez de N pixels serin
Ni2k y en vez de n polfgonos serin nick. El coste es, pues, el siguiente:
nn?
Eg SOD te sic=1
log(4/c)
TIN. (ne sit