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
