hi

mpiGather[{$IdProc, $NProc}]

ExecuteLife[list_] := 
      Module[{dims, rows, columns, i, j}, dims = Dimensions[list]; 
        If[Length[dims] == 2, rows = dims[[1]] - 2; 
          columns = dims[[2]] - 2; 
          If[(rows > 0) && (columns > 0), 
            Table[EvaluateLife[list, i, j], {i, dims[[1]]}, {j, 
                dims[[2]]}]]]]; 
    EvaluateLife[list_, x_, y_] := 
      Module[{dims, i, j, count}, dims = Dimensions[list]; 
        If[(x > 1) && (x < dims[[1]]) && (y > 1) && (y < 
                dims[[2]]), count = 0; 
          Do[Do[If[((i ≠ 0) || (j ≠ 
                          0)) && (list[[x + i, y + j]] > 0), 
                count = count + 1], {i, -1, 1}], {j, -1, 1}]; 
          Switch[count, 2, If[list[[x, y]] > 0, list[[x, y]] + 1, 0], 
            3, list[[x, y]] + 1, _, 0], list[[x, y]]]]; 
    PeriodicBoundaryConditions[list_] := 
      Module[{dims, i, j}, dims = Dimensions[list]; 
        Table[list[[Switch[i, 1, dims[[1]] - 1, dims[[1]], 2, _, 
                i], Switch[j, 1, dims[[2]] - 1, dims[[2]], 2, _, 
                j]]], {i, dims[[1]]}, {j, dims[[2]]}]]; 
    AddRandomTable[list_] := 
      Module[{dims, i, j}, dims = Dimensions[list]; 
        Do[Random[], {1 + dims[[1]]*dims[[2]]*$IdProc}]; 
        Table[list[[i, j]] + If[Random[] > 0.8, 1, 0], {i, 
            dims[[1]]}, {j, dims[[2]]}]]

LifeWidth = LifeHeight = 360

a = Table[0, {i, LifeWidth}, {j, LifeHeight}]; a = AddRandomTable[a]; 
    ArrayPlot[Transpose[a]]

Timing[a = PeriodicBoundaryConditions[a]; a = ExecuteLife[a]; 
      ArrayPlot[Transpose[a]]]

b = Table[0, {i, LifeWidth/$NProc}, {j, LifeHeight}]; 
    b = AddRandomTable[b]; ArrayPlot[Transpose[b]]

Timing[b = PeriodicBoundaryConditions[b]; EdgeCell[b]; 
      b = ExecuteLife[b]; ArrayPlot[Transpose[b]]]

Timing[b = PeriodicBoundaryConditions[b]; EdgeCell[b]; 
      mpiGather[ArrayPlot[Transpose[b], DisplayFunction -> Identity], c, 
        0]; b = ExecuteLife[b]; 
      Show[GraphicsArray[c, GraphicsSpacing -> 0.00]]]