Articulo de referencia

El algoritmo de Cannon

En ciencias de la computación , el algoritmo de Cannon es un algoritmo distribuido para la multiplicación de matrices en mallas bidimensionales, descrito por primera vez en 1969...

En ciencias de la computación , el algoritmo de Cannon es un algoritmo distribuido para la multiplicación de matrices en mallas bidimensionales, descrito por primera vez en 1969 por Lynn Elliot Cannon . [ 1 ] [ 2 ]

Es especialmente adecuado para computadoras dispuestas en una malla N × N. [ 3 ] Si bien el algoritmo de Cannon funciona bien en cuadrículas 2D homogéneas, se ha demostrado que extenderlo a cuadrículas 2D heterogéneas es difícil. [ 4 ]

La principal ventaja del algoritmo es que sus requisitos de almacenamiento permanecen constantes y son independientes del número de procesadores. [ 2 ]

El algoritmo de multiplicación de matrices universal escalable (SUMMA) [ 5 ] es un algoritmo más práctico que requiere menos espacio de trabajo y elimina la necesidad de una cuadrícula cuadrada bidimensional. Es utilizado por las bibliotecas ScaLAPACK , PLAPACK y Elemental .

Descripción general del algoritmo

Al multiplicar dos matrices A y B de n × n , necesitamos n × n nodos de procesamiento p dispuestos en una cuadrícula 2D.

// PE(i , j) k := (i + j) mod N; a := a[i][k]; b := b[k][j]; c[i][j] := 0; para (l := 0; l < N; l++) { c[i][j] := c[i][j] + a * b; concurrentemente { enviar a a PE(i, (j + N − 1) mod N); enviar b a PE((i + N − 1) mod N, j); } con { recibir a' de PE(i, (j + 1) mod N); recibir b' de PE((i + 1) mod N, j ); } a := a'; b := b'; }

Necesitamos seleccionar k en cada iteración para cada elemento procesador (PE) para que los procesadores no accedan a los mismos datos para el cálculo.aikbkj{\displaystyle a_{ik}*b_{kj}}.

Por lo tanto, los procesadores en la misma fila/columna deben comenzar la suma con índices diferentes. Si, por ejemplo, PE(0,0) calculaa00b00{\displaystyle a_{00}*b_{00}}En el primer paso, PE(0,1) eligea01b11{\displaystyle a_{01}*b_{11}}Primero. La selección de k  := (i + j) mod n para PE(i,j) satisface esta restricción para el primer paso.

En el primer paso distribuimos las matrices de entrada entre los procesadores según la regla anterior.

En las siguientes iteraciones elegimos un nuevo k'  := (k + 1) mod n para cada procesador. De esta manera, cada procesador seguirá accediendo a diferentes valores de las matrices. Los datos necesarios estarán entonces siempre en los procesadores vecinos. Un PE(i,j) necesita entonces ela{\displaystyle a}de PE(i,(j + 1) mod n) y elb{\displaystyle b}de PE((i + 1) mod n,j) para el siguiente paso. Esto significa quea{\displaystyle a}debe pasarse cíclicamente a la izquierda y tambiénb{\displaystyle b}cíclicamente hacia arriba. Los resultados de las multiplicaciones se suman como de costumbre. Después de n pasos, cada procesador ha calculado todosaikbkj{\displaystyle a_{ik}*b_{kj}}una vez y su suma es así la buscadadoij{\displaystyle c_{ij}}.

Después de la distribución inicial de cada procesador, solo se deben almacenar los datos para el siguiente paso. Estos son el resultado intermedio de la suma anterior, unaik{\displaystyle a_{ik}}y unbkj{\displaystyle b_{kj}}Esto significa que las tres matrices solo necesitan almacenarse en la memoria una vez, distribuidas uniformemente entre los procesadores.

Generalización

En la práctica, tenemos muchos menos procesadores que elementos de la matriz. Podemos reemplazar los elementos de la matriz con submatrices, de modo que cada procesador procese más valores. La multiplicación y suma escalar se convierten en multiplicación y suma matricial secuencial. El ancho y la altura de las submatrices seránnorte=norte/pag{\displaystyle N=n/{\sqrt {p}}}.

El tiempo de ejecución del algoritmo es T(norte,pag)=Tdooll(norte/norte,pag)+norteTsmiq(norte/norte)+2(norte1)(Tstart+Tbytmi(norte/norte)2){\displaystyle T{\mathcal {(n,p)}}=T_{coll}(n/N,p)+N*T_{seq}(n/N)+2(N-1)(T_{start}+T_{byte}(n/N)^{2})}, dóndeTdooll{\displaystyle T_{coll}}es el tiempo de la distribución inicial de las matrices en el primer paso,Tsmiq{\displaystyle T_{seq}}es el cálculo de los resultados intermedios yTstart{\displaystyle T_{start}}yTbytmi{\displaystyle T_{byte}}representa el tiempo que se tarda en establecer una conexión y en la transmisión de un byte, respectivamente.

Una desventaja del algoritmo es que se producen muchas conexiones con mensajes de pequeño tamaño. Sería mejor poder transmitir más datos en cada mensaje.

Véase también

Referencias

  1. Cannon, Lynn Elliot (14 de julio de 1969). Una computadora celular para implementar el algoritmo del filtro de Kalman (tesis doctoral). Universidad Estatal de Montana.
  2. 1 2 Gupta, H.; Sadayappan, P. (1994). Multiplicación de matrices eficiente en comunicación en hipercubos (Informe técnico). Stanford Infolab.
  3. "4.2 Multiplicación de matrices en una máquina de memoria distribuida" . Álgebra lineal numérica . Proyecto de educación en ciencias computacionales. 1991–1995. Archivado del original el 1 de abril de 2018.
  4. ^ Pineau, Jean-François (octubre de 2010). Programación consciente de la comunicación en plataformas heterogéneas maestro-trabajador (PhD). Escuela normal superior de lyon. tel-00530131.
  5. van de Geijn, Robert A.; Watts, Jerrell (abril de 1997). "SUMMA: algoritmo escalable universal de multiplicación de matrices" . Concurrency: Practice and Experience . 9 (4): 255– 274. doi : 10.1002/(SICI)1096-9128(199704)9:4 < 255::AID-CPE250 > 3.0.CO ; 2-2 .
  • Demmel, J. (1996). "Clase 9: Multiplicación paralela de matrices" . CS267 Aplicaciones de computadoras paralelas . UC Berkeley.
  • Harwood, Aaron (2003). "Multiplicación de matrices: algoritmo de Cannon" . 433-498 Redes y complejidad del procesamiento paralelo . Universidad de Melbourne. Archivado del original el 3 de julio de 2007.