Después de realizar las sumas parciales en su segmento
el proceso
intercambia con su vecino
(
, donde
significa XOR)
en dimensión
la suma del hipercubo
-dimensional en el que está.
El subtotal recibido se acumula para la siguiente
etapa. Si el proceso
está en el hipercubo alto
(Esto es, si el bit
de
está a 1) lo acumula también a su suma parcial.
Por último suma los valores de la suma parcial a cada
uno de los elementos de su segmento.
Para una descripción mas completa del algoritmo
véase [2] y en concreto el capítulo 3, página 58 (16 del pdf)
accesible desde el enlace
http://nereida.deioc.ull.es/˜casiano/book/cap3redes.pdf.
Tenga en cuenta que los canales hacia un procesador
son compartidos
para escritura por los restantes (
) y por tanto se pueden producir
race conditions o condiciones de carrera.
Ilustre un ejemplo de tal situación.
Para solucionar el problema, escriba
una subrutina
receive
para la recepción de mensajes
que recibe como argumento
el procesador fuente del mensaje. La subrutina administra
un hash (declárelo en clausura con la subrutina)
en la que almacena los mensajes que llegan
y que no son del fuente solicitado. Cuando es llamada,
la subrutina comprueba si el mensaje ya solicitado esta en el hash.
Si es asi, lo obtiene, lo elimina del hash y lo retorna.
En caso contrario permanece a la espera por el canal
del mensaje solicitado. Los mensajes que llegan
y que no son del fuente solicitado son almacenados.
Cuando llega el mensaje solicitado termina la espera y se
retorna su valor.
Escriba una subrutina send
de envío que colabore con la subrutina
de recepción descrita.
Casiano Rodríguez León