  
  [1X6 [33X[0;0YOn a parallel nilpotent quotient algorithm[133X[101X
  
  [33X[0;0YWe included a parallel version of [5Xlpres[105X's nilpotent quotient algorithm using
  the  [5XParGAP[105X-package  of  [5XGAP[105X;  see  [Coo04]. In this chapter, we outline the
  basic  usage of this parallel part of the [5Xlpres[105X-package. For further details
  on  the parallel [5XGAP[105X-sessions we refer to the [5XParGAP[105X-manual [Coo04]. We note
  that  the  [5XParGAP[105X-package has some bottlenecks in practice. Nevertheless the
  significant  speed-up  of  our  computations on a multiple-core system shows
  that this is a reasonable extension of the [5Xlpres[105X-package.[133X
  
  
  [1X6.1 [33X[0;0YUsage[133X[101X
  
  [33X[0;0YFor using the parallel version of the nilpotent quotient algorithm, you will
  need  to install the [5XParGAP[105X-package as described in its manual [Coo04]. When
  using  Version  1.1.2  of  the  [5XParGAP[105X-package,  you  will need to apply the
  following  patch  to `pargap/lib/masslave.g' as otherwise the [5XParGAP[105X-session
  may   crash.   On   a   linux   machine   you   can   simply  use  `patch  <
  ../../nql/gap/pargap/patch' from within the directory `pargap/lib/'.[133X
  
  --- masslave.g	2001-11-16 13:17:04.000000000 +0100
  +++ masslave.g	2009-05-06 12:20:19.000000000 +0200
  @@ -467,8 +467,9 @@
     if Length(deltas)>1 then max2 := Maximum(max2, deltas[Length(deltas)-1]); fi;
     max1 := deltas[Length(deltas)];
     pos1 := Position( List(slaveArray, x->realtime-x.time), max1 );
  -  if max1 > slaveTaskTimeFactor and max1 > 30
  -     and slaveTaskTime[pos2].total > 60 then
  +  if max1 > slaveTaskTimeFactor and
  +     max1 > 30 and pos2 <> fail and 
  +     slaveTaskTime[pos2].total > 60 then
       Print("SLAVE ",pos1," SEEMS DEAD!!\n");
     fi;
   end);
  
  [33X[0;0YNow,  you  are  ready  for  creating  a  [5XParGAP[105X-session and you can load the
  [5Xlpres[105X-package  from  within  [5XParGAP[105X  using  `LoadPackage' as usual. The same
  methods  as  described previously are available. The following example shows
  the application of the `NilpotentQuotient'-method to the Grigorchuk group on
  a  quad-core  machine.  Note  that the significant speed-up of the nilpotent
  quotient  algorithm  is especially noticeable for large nilpotent quotients.
  This   parallel  version  of  [5Xlpres[105X  successfully  computes  some  nilpotent
  quotients which normally took more than a month to complete.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[28XGAP4, Version: 4.4.12 of 17-Dec-2008, i686-pc-linux-gnu-gcc[128X[104X
    [4X[28XGAP4, Version: 4.4.12 of 17-Dec-2008, i686-pc-linux-gnu-gcc[128X[104X
    [4X[28XGAP4, Version: 4.4.12 of 17-Dec-2008, i686-pc-linux-gnu-gcc[128X[104X
    [4X[28XGAP4, Version: 4.4.12 of 17-Dec-2008, i686-pc-linux-gnu-gcc[128X[104X
    [4X[28XGAP4, Version: 4.4.12 of 17-Dec-2008, i686-pc-linux-gnu-gcc[128X[104X
    [4X[25Xgap>[125X [27XTOPCnumSlaves;[127X[104X
    [4X[28X4[128X[104X
    [4X[25Xgap>[125X [27XLoadPackage("LPRES");[127X[104X
    [4X[28Xtrue[128X[104X
    [4X[25Xgap>[125X [27XG:=ExamplesOfLPresentations(1);[127X[104X
    [4X[28X<L-presented group on the generators [ a, b, c, d ]>[128X[104X
    [4X[25Xgap>[125X [27XSetInfoLevel(InfoLPRES,1);[127X[104X
    [4X[25Xgap>[125X [27XNilpotentQuotient(G,2);[127X[104X
    [4X[28X#I  Class 1: 3 generators with relative orders: [ 2, 2, 2 ][128X[104X
    [4X[28X#I  Computing a polycyclic presentation for the covering group...[128X[104X
    [4X[28X#I  Checking the consistency relations...[128X[104X
    [4X[28Xmaster -> 1: (AGGLOM_TASK): [ [ -3, 1 ], [ -3, 2 ], [ -2, 1 ], [ 2, -1 ],[128X[104X
    [4X[28X  [ 3, -1 ] ][128X[104X
    [4X[28Xmaster -> 2: (AGGLOM_TASK): [ [ 3, -2 ], [ 1 ], [ 2 ], [ 3 ] ][128X[104X
    [4X[28X1 -> master: [ [ 0, 0, 0, 0, 0, -2, 0 ], [ 0, 0, 0, 0, 0, 0, -2 ],[128X[104X
    [4X[28X  [ 0, 0, 0, 0, -2, 0, 0 ], [ 0, 0, 0, 0, -2, 0, 0 ],[128X[104X
    [4X[28X  [ 0, 0, 0, 0, 0, -2, 0 ] ][128X[104X
    [4X[28X2 -> master: [ [ 0, 0, 0, 0, 0, 0, -2 ], [ 0, 0, 0, 0, 0, 0, 0 ],[128X[104X
    [4X[28X  [ 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0 ] ][128X[104X
    [4X[28X#I  Broadcasting the slaves...[128X[104X
    [4X[28X#I  Inducing the endomorphisms...[128X[104X
    [4X[28Xmaster -> 1:  1[128X[104X
    [4X[28Xmaster -> 2:  2[128X[104X
    [4X[28Xmaster -> 3:  3[128X[104X
    [4X[28Xmaster -> 4:  4[128X[104X
    [4X[28X3 -> master: [ 2, 1 ][128X[104X
    [4X[28XUPDATE: [ 3, [ 2, 1 ] ][128X[104X
    [4X[28X1 -> master: [ 2, 1, 8, 1 ][128X[104X
    [4X[28XUPDATE: [ 1, [ 2, 1, 8, 1 ] ][128X[104X
    [4X[28X2 -> master: [ 2, 1, 3, 1, 4, 1 ][128X[104X
    [4X[28XUPDATE: [ 2, [ 2, 1, 3, 1, 4, 1 ] ][128X[104X
    [4X[28Xmaster -> 1:  5[128X[104X
    [4X[28Xmaster -> 2:  6[128X[104X
    [4X[28Xmaster -> 3:  7[128X[104X
    [4X[28X4 -> master: [ 4, -1, 6, -1, 10, -1 ][128X[104X
    [4X[28XUPDATE: [ 4, [ 4, -1, 6, -1, 10, -1 ] ][128X[104X
    [4X[28X1 -> master: [ 6, 1, 8, 2 ][128X[104X
    [4X[28XUPDATE: [ 5, [ 6, 1, 8, 2 ] ][128X[104X
    [4X[28X2 -> master: [ 4, 2, 6, 1, 7, 1, 10, 1 ][128X[104X
    [4X[28XUPDATE: [ 6, [ 4, 2, 6, 1, 7, 1, 10, 1 ] ][128X[104X
    [4X[28X3 -> master: [ 6, 1 ][128X[104X
    [4X[28XUPDATE: [ 7, [ 6, 1 ] ][128X[104X
    [4X[28Xmaster -> 1:  8[128X[104X
    [4X[28Xmaster -> 2:  9[128X[104X
    [4X[28Xmaster -> 3:  10[128X[104X
    [4X[28X1 -> master: [ 10, 1 ][128X[104X
    [4X[28XUPDATE: [ 8, [ 10, 1 ] ][128X[104X
    [4X[28X2 -> master: [  ][128X[104X
    [4X[28XUPDATE: [ 9, [  ] ][128X[104X
    [4X[28X3 -> master: [ 10, -1 ][128X[104X
    [4X[28XUPDATE: [ 10, [ 10, -1 ] ][128X[104X
    [4X[28X#I  Broadcasting the slaves...[128X[104X
    [4X[28X#I  Mapping the relations...[128X[104X
    [4X[28Xmaster -> 1:  1[128X[104X
    [4X[28Xmaster -> 2:  2[128X[104X
    [4X[28Xmaster -> 3:  3[128X[104X
    [4X[28Xmaster -> 4:  4[128X[104X
    [4X[28X1 -> master: [ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 ][128X[104X
    [4X[28X2 -> master: [ 0, 0, 0, 2, 0, 1, 1, 0, 0, 1 ][128X[104X
    [4X[28X3 -> master: [ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 ][128X[104X
    [4X[28X4 -> master: [ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 ][128X[104X
    [4X[28Xmaster -> 1:  5[128X[104X
    [4X[28Xmaster -> 2:  6[128X[104X
    [4X[28Xmaster -> 3:  7[128X[104X
    [4X[28X1 -> master: [ 0, 0, 0, 1, 0, 1, 1, 0, 0, 1 ][128X[104X
    [4X[28X2 -> master: [ 0, 0, 0, 0, 0, 0, 0, 0, 2, 0 ][128X[104X
    [4X[28X3 -> master: [ 0, 0, 0, 0, 0, 0, 0, 4, 6, 4 ][128X[104X
    [4X[28X#I  Start spinning...[128X[104X
    [4X[28X#I  Extend the quotient system...[128X[104X
    [4X[28X#I  Class 2: 2 generators with relative orders: [ 2, 2 ][128X[104X
    [4X[28XPcp-group with orders [ 2, 2, 2, 2, 2 ][128X[104X
  [4X[32X[104X
  
  [33X[0;0YNote  that  the only difference in the parallel version of the [5Xlpres[105X-package
  is  a  parallel version of the operation `ExtendQuotientSystem'. This latter
  operation covers the induction step of the nilpotent quotient algorithm.[133X
  
