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