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
de dos matrices
es que la matrix
se replica en los distintos procesadores
mientras que la matriz
se distribuye en submatrices de
tamaño
siendo
el número
de procesadores.
Casiano Rodríguez León