performance - Perl fast matrix multiply -


i have implemented following statistical computation in perl http://en.wikipedia.org/wiki/fisher_information.
results correct. know because have 100's of test cases match input , output. problem need compute many times every single time run script. average number of calls function around 530. used devel::nytprof find out out slow parts are. have optimized algorithm traverse top half of matrix , reflect onto bottom same. i'm not perl expert, need know if there can try speed perl. script distributed clients compiling c file not option. there perl library can try? needs sub second in speed if possible.

more information $matrixref matrix of floating point numbers $rows $variables. here nytprof dump function.

#----------------------------------------------- # #----------------------------------------------- sub computexpx # spent 4.27s within computexpx called 526 times, avg 8.13ms/call: # 526 times (4.27s+0s) computeefficiency @ line 7121, avg 8.13ms/call { 526 0s                  ($matrixref, $rows, $variables) = @_;  526 0s                  $r = 0; 526 0s                  $c = 0; 526 0s                  $k = 0; 526 0s                  $sum = 0; 526 0s                  @xpx = ();  526 11.0ms              ($r = 0; $r < $variables; $r++)                         { 14202   19.0ms                @temp = (0) x $variables; 14202   6.01ms                push(@xpx, \@temp); 526 0s                  } 526 7.01ms              ($r = 0; $r < $variables; $r++)                         { 14202   144ms                   ($c = $r; $c < $variables; $c++)                                 { 198828  43.0ms                                  $sum = 0;                                         #for ($k = 0; $k < $rows; $k++) 198828  101ms                           foreach $rowref (@{$matrixref})                                         {                                                 #$sum += $matrixref->[$k]->[$r]*$matrixref->[$k]->[$c]; 6362496 3.77s                                   $sum += $rowref->[$r]*$rowref->[$c];                                         }  198828  80.1ms                                  $xpx[$r]->[$c] = $sum;                                                 #reflect on other side of matrix 198828  82.1ms                                  $xpx[$c]->[$r] = $sum if ($r != $c); 14202   1.00ms                          } 526 2.00ms                  }  526 2.00ms                  return \@xpx; } 

since each element of result matrix can calculated independently, should possible calculate some/all of them in parallel. in other words, none of instances of innermost loop depend on results of other, run simultaneously on own threads.


Comments

Popular posts from this blog

jquery - How can I dynamically add a browser tab? -

node.js - Getting the socket id,user id pair of a logged in user(s) -

keyboard - C++ GetAsyncKeyState alternative -