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
n. local.host: Sending request for user-authentication service. local.host: Service accepted: ssh-userauth. local.host: Trying empty user-authentication request. local.host: Authentication methods that can continue: publickey,password. local.host: Next method to try is publickey. local.host: Trying pubkey authentication with key file '/home/pp2/.ssh/id_dsa' local.host: Authentication methods that can continue: publickey,password. local.host: Next method to try is publickey. local.host: Next method to try is password. local.host: Trying password authentication. local.host: Login completed, opening dummy shell channel. local.host: channel 0: new [client-session] local.host: Requesting channel_open for channel 0. local.host: channel 0: open confirm rwindow 0 rmax 32768 local.host: Got channel open confirmation, requesting shell. local.host: Requesting service shell on channel 0. local.host: channel 1: new [client-session] local.host: Requesting channel_open for channel 1. local.host: Entering interactive session. local.host: Sending command: passwd local.host: Requesting service exec on channel 1. local.host: channel 1: open confirm rwindow 0 rmax 32768 --------- <- MODO INTERACTIVO: old password ********* <- MODO INTERACTIVO: new password ********* <- MODO INTERACTIVO: repeat new password local.host: input_channel_request: rtype exit-status reply 0 local.host: channel 1: rcvd eof local.host: channel 1: output open -> drain local.host: channel 1: rcvd close local.host: channel 1: input open -> closed local.host: channel 1: close_read local.host: channel 1: obuf empty local.host: channel 1: output drain -> closed local.host: channel 1: close_write local.host: channel 1: send close local.host: channel 1: full closed

Casiano Rodríguez León
2011-06-03