The only modification to the source of the GAP kernel is in src/gap.c.
These modifications have "#ifdef GAPMPI" conditionalizations around them,
and so are not seen unless the GAP/MPI package has been installed.
The gap binary also links in src/gapmpi.c.

src/gap.c:InitializeGap() calls src/gapmpi.c:InitGapmpi().
InitGapmpi() is called early in the GAP initialization.
If the gap binary was _NOT_ called by a path ending in /gapmpi (typically
  a symbolic link to the true gap binary), then we assme this is a traditional
  GAP user, and InitGapmpi() terminates _without_ installing the GAP/MPI
  package.
If this is a gapmpi binary, InitGapmpi() calls MPI_Init() to initialize the
  MPI package.  MPI_Init() also modifies the command line argument
  (argc and argv) to remove any command line flags meant only for
  GAP/MPI and not for GAP.  This is done before GAP inspects its
  command line.
  If this is a slave GAP/MPI process, InitGapmpi() also modifies BreakOnError,
  SyBanner and SyQuiet, since slave processes do not have a user at
  the console to handle break loops, invormational messages, etc.
  Finally, if this is a slave, then interrupts (^C) are ignored.
  This is necessary, since a slave uses rsh for standard input, and so
  it will see remote interrupts.
Next, src/gap.c:InitInfoFuncs() will install the built-in modules.
  The last installation to be called is a call to:
       src/gapmpi.c:InitInfoGapmpi(), which returns a gapmpi module struct.
  That struct includes functions, src/gapmpi.c:InitKernel(),
  and src/gapmpi.c:InitLibrary(), which are invoked by GAP's process
  for installing built-in modules.  The former installs the GAP tables and
  registers information about the gapmpi module without creating the
  objects.  This produces no outwardly visible change in GAP.
  The latter return immediatly if MPI_Initialized() returns false.
  Otherwise, the latter installs the functions and variables that were defined
  by C code in src/gapmpi.c, using the traditional GAP module mechanism.
At this point, the GAP kernel has installed its built-in modules, and
  the new built-in functions, MPI_XXX(), GAPMPI_XXX(), etc. now exist.
  Next, GAP loads certain of its libraries.  The earlier call to MPI_Init()
  has caused libmpi.a to look at the procgroup file (found either in the
  current directory or as a command line argument using -p4pg).  That
  procgroup file indicates what remote hosts (or possibly 'localhost')
  to use for slave processes, and where gapmpi.sh can be found on those
  remote processes.  libmpi.a then uses "rsh" to invoke a remote gapmpi
  in a manner similar to what was described above.
After the GAP kernel is functioning, gapmpi should be present in
  .../pkg/ALLPKG.  So .../pkg/gapmpi/init.g is read and the
  gapmpi package is declared.  Later, GAP reads .../pkg/gapmpi/read.g.
  That file invokes .../pkg/gapmpi/lib/slavelist.g.  The file
  slavelist.g has the master and slave exchange messages allowing the
  slave to set its current directory to the same as that of the master
  (or report that the slave was unable).  Some indication of this
  conversation is printed to the screen, including, e.g.:
    Receiving from slave 1
    Receiving from slave 2

