static void TestSendReceive(Communicator communicator, string[] args) { Console.WriteLine($"I am alive! Rank {communicator.Rank}"); if (communicator.Rank == 0) { //Read data Jacoby jacoby = EquationReader.ReadJacoby(args[0], args[1], double.Parse(args[2])); //Send data for (int workerIndex = 1; workerIndex < communicator.Size; workerIndex++) { communicator.Send(jacoby, workerIndex, (int)JacobyMessageType.JacobyMessage); } } else { var jacoby = communicator.Receive <Jacoby>(0, (int)JacobyMessageType.JacobyMessage); var result = jacoby.SolveSingleThread(); foreach (var val in result) { Console.WriteLine($"I, worker of rank {communicator.Rank} calculate {val}"); } } }
static void DoParallelJacoby(string[] args) { MPI.Environment.Run(ref args, communicator => { Console.WriteLine($"{communicator.Rank} birthday!"); var isMaster = communicator.Rank == 0; if (isMaster) { double[] result = null; using (var performanceCounter = new PerformanceCounter("Master. Total duration: ")) { Jacoby jacoby = null; using (var perfRead = new PerformanceCounter("Master. Jacoby reading time: ")) { jacoby = EquationReader.ReadJacoby(args[0], args[1], double.Parse(args[2])); } using (var perfWork = new PerformanceCounter("Master. Work duration: ")) { result = jacoby.MPIHead(communicator); //double[] result = jacoby.SolveSingleThreadDebug(2); } } if (result == null) { throw new Exception("Result is null"); } EquationWriter.Write(result, args[3]); } else { using (var perfCounter = new PerformanceCounter($"Worker {communicator.Rank} total lifetime: ")) { Jacoby.MPIWorker(communicator); } } }); }