Práctica: Producto de Matrices

Escriba un programa paralelo similar al explicado en GRID::Machine::perlparintro que realice el producto de dos matrices.

Pueden serle de utilidad los módulos Test::LectroTest::Generator y PDL.

El módulo Test::LectroTest::Generator facilita la escritura de generadores aleatorios:

  DB<1> use Test::LectroTest::Generator qw(:common Gen)
  DB<2> $mg = List( List( Int(sized=>0), length => 3 ), length => 3)
  DB<3> $a = $mg->generate
  DB<4> x $a
0  ARRAY(0x84e4484)
   0  ARRAY(0x84e42ec)
      0  18346
      1  '-11920'
      2  '-12209'
   1  ARRAY(0x84e46b8)
      0  '-4086'
      1  25348
      2  28426
   2  ARRAY(0x84e4694)
      0  '-21350'
      1  7670
      2  '-27287'
El módulo PDL facilita un gran número de librerías de soporte al científico. En particular para las operaciones mas usuales con matrices:

  DB<5> use PDL
  DB<6> $a = pdl $a # Ahora $a es una matriz PDL
  DB<7> $b = inv $a # $b es la inversa de $a
  DB<8> x $b        # PDL esta implementado en C
0  PDL=SCALAR(0x8367960)
   -> 139669992
  DB<9> print $b    # La conversión a cadena está sobrecargada

[
 [ 6.3390263e-05   2.919038e-05  2.0461769e-06]
 [ 5.0059363e-05  5.3047336e-05  3.2863591e-05]
 [-3.5527057e-05 -7.9283745e-06 -2.9010963e-05]
]
  DB<10> print $a x $b # El operador x es el producto de matrices
[
 [             1  1.1514905e-16   1.163891e-16]
 [ 2.1000996e-16              1 -7.6653094e-17]
 [-1.0554708e-16 -5.3071696e-17              1]
]
Puede usar el módulo PDL para escribir el programa que hace el producto de matrices en Perl o bien reescribirlo en C. Tenga presente evitar los buffers intermedios, esto es, hacer flushout de todas las salidas para que no se produzcan retrasos en las comunicaciones (usando, por ejemplo la función fflush en C y el método autoflush de los objetos IO::Handle en Perl).

La idea para paralelizar el producto $ A \times B$ de dos matrices $ n \times n$ es que la matrix $ A$ se replica en los distintos procesadores mientras que la matriz $ B$ se distribuye en submatrices de tamaño $ n \times \frac{n}{p}$ siendo $ p$ el número de procesadores.

Casiano Rodríguez León
2010-03-22