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