[padb-devel] [padb commit] r79 - Change mpi_watch_all() to attach to each process

codesite-noreply at google.com codesite-noreply at google.com
Mon Jun 29 18:26:55 BST 2009


Author: apittman
Date: Mon Jun 29 10:19:39 2009
New Revision: 79

Modified:
    branches/full-duplex/src/padb

Log:
Change mpi_watch_all() to attach to each process
at the start, then query each one and finally detach
from each process.  Reduced contention on the CPU means
this leads to a performance improvement.


Modified: branches/full-duplex/src/padb
==============================================================================
--- branches/full-duplex/src/padb	(original)
+++ branches/full-duplex/src/padb	Mon Jun 29 10:19:39 2009
@@ -5862,28 +5862,71 @@
  #
  # * - error.

-sub mpi_watch {
-    my ( $carg, $vp, $pid ) = @_;
-
-    my @mq   = fetch_mpi_queue( $carg, $vp, $pid );
-    my $sm   = 0;
-    my $rm   = 0;
-    my $um   = 0;
-    my $good = ".";
+sub mpi_watch_all {

+    my ( $carg, $list ) = @_;
      my %res;
-
      my $fns = mpi_watch_load($carg);

-    my $fnmode;
-    my $fnreal;
-    my $gdb = gdb_start();
-    kill( "CONT", $pid );
-    if ( gdb_attach( $gdb, $pid ) ) {
-        my @threads = gdb_dump_frames_per_thread($gdb);
-        gdb_detach($gdb);
-        gdb_quit($gdb);
+    foreach my $proc ( @{$list} ) {
+        my $vp  = $proc->{vp};
+        my $pid = $proc->{pid};
+        my $gdb = gdb_start();
          kill( "CONT", $pid );
+        if ( gdb_attach( $gdb, $pid ) ) {
+            $proc->{gdb} = $gdb;
+        } else {
+            output $vp, "Failed to attach to to process";
+        }
+    }
+
+    foreach my $proc ( @{$list} ) {
+        my $vp  = $proc->{vp};
+        my $pid = $proc->{pid};
+        my $gdb = $proc->{gdb};
+
+        my @mq;
+        my $sm   = 0;
+        my $rm   = 0;
+        my $um   = 0;
+        my $good = ".";
+        my $fnmode;
+
+        @mq = fetch_mpi_queue_gdb( $carg, $vp, $pid, $gdb );
+
+        if ( $#mq == 0 ) {
+            $good = ",";
+        } else {
+            foreach my $o (@mq) {
+                if ( $o =~ /Operation (\d)/ ) {
+                    my $type = $1;
+                    $sm++ if ( $type == 0 );
+                    $rm++ if ( $type == 1 );
+                    $um++ if ( $type == 2 );
+                }
+            }
+        }
+
+        my $mt = ( grep { $_ } ( $sm, $rm, $um ) );
+        if ( $mt != 0 ) {
+            my $mode = "*";
+
+            if ($um) {
+                $mode = "u";
+                $mode = "U" if ( $mt != 1 );
+            } else {
+                if ( $mt == 1 ) {
+                    $mode = "s" if ($sm);
+                    $mode = "r" if ($rm);
+                } else {
+                    $mode = "m";
+                }
+            }
+            $res{$vp}{state} = $mode;
+            next;
+        }
+
+        my @threads = gdb_dump_frames_per_thread($gdb);

          foreach my $thread ( sort { $a->{id} <=> $b->{id} } @threads ) {
              my @frames = @{ $thread->{frames} };
@@ -5891,74 +5934,35 @@
                  my $frame = $frames[$i];
                  if ( defined $fns->{fns}{ $frame->{func} } ) {
                      $fnmode = $fns->{fns}{ $frame->{func} };
-                    $fnreal = $frame->{func};
                      last;
                  }
              }
          }
-    }

-    # $res{mq} = \@mq;
-    if ( $#mq == 0 ) {
-        $good = ",";
-    } else {
-        foreach my $o (@mq) {
-            if ( $o =~ /Operation (\d)/ ) {
-                my $type = $1;
-                $sm++ if ( $type == 0 );
-                $rm++ if ( $type == 1 );
-                $um++ if ( $type == 2 );
-            }
+        if ( defined $fnmode ) {
+            $res{$vp}{state} = $fns->{names}{$fnmode};
+            next;
+
          }
-    }

-    my $mt = ( grep { $_ } ( $sm, $rm, $um ) );
-    if ( $mt != 0 ) {
-        my $mode = "*";
-
-        if ($um) {
-            $mode = "u";
-            $mode = "U" if ( $mt != 1 );
+        my $m = find_from_status( $pid, "State" );
+        if ( $m eq "R" ) {
+            $m = $good;
+        } elsif ( $m eq "S" ) {
+            $m = "-";
          } else {
-            if ( $mt == 1 ) {
-                $mode = "s" if ($sm);
-                $mode = "r" if ($rm);
-            } else {
-                $mode = "m";
-            }
+            $m = "*";
          }
-        $res{state} = $mode;
-        output( $vp, $mode );
-        return \%res;
-    }
-
-    if ( defined $fnmode ) {
-        $res{state} = "$fns->{names}{$fnmode} $fnreal  ";
-        $res{state} = $fns->{names}{$fnmode};
-        return \%res;
-    }

-    my $m = find_from_status( $pid, "State" );
-    if ( $m eq "R" ) {
-        $m = $good;
-    } elsif ( $m eq "S" ) {
-        $m = "-";
-    } else {
-        $m = "*";
+        $res{$vp}{state} = $m;
      }
-    output $vp, $m;
-    $res{state} = $m;
-    return \%res;
-}

-sub mpi_watch_all {
-    my ( $carg, $list ) = @_;
-    my %res;
      foreach my $proc ( @{$list} ) {
-        my $vp  = $proc->{vp};
-        my $pid = $proc->{pid};
-        $res{$vp} = mpi_watch( $carg, $vp, $pid );
+        my $gdb = $proc->{gdb};
+        gdb_detach($gdb);
+        gdb_quit($gdb);
      }
+
      return \%res;
  }





More information about the padb-devel mailing list