public static void MPIKaratsubaMaster(Polynomial polynomial1, Polynomial polynomial2) { DateTime start = DateTime.Now; Polynomial result = new Polynomial(polynomial1.Degree * 2); if (Communicator.world.Size == 1) { result = Multiplications.AsynchronousKaratsubaMultiply(polynomial1, polynomial2); } else { Communicator.world.Send <int>(0, 1, 0); Communicator.world.Send <int[]>(polynomial1.Coefficients, 1, 0); Communicator.world.Send <int[]>(polynomial2.Coefficients, 1, 0); if (Communicator.world.Size == 2) { Communicator.world.Send <int[]>(new int[0], 1, 0); } else { Communicator.world.Send <int[]>(Enumerable.Range(2, Communicator.world.Size - 2).ToArray(), 1, 0); } int[] coefs = Communicator.world.Receive <int[]>(1, 0); result.Coefficients = coefs; } double time = (DateTime.Now - start).Milliseconds; Console.WriteLine("MPI Karatsuba: " + result.ToString() + "\n" + "TIME: " + time.ToString() + " milliseconds"); }
public static void MPIMultiplicationWorker() { //Console.WriteLine("Child"); Polynomial polynomial1 = Communicator.world.Receive <Polynomial>(0, 0); Polynomial polynomial2 = Communicator.world.Receive <Polynomial>(0, 0); int begin = Communicator.world.Receive <int>(0, 0); int end = Communicator.world.Receive <int>(0, 0); Polynomial result = Multiplications.MPIMultiply(polynomial1, polynomial2, begin, end); Communicator.world.Send(result, 0, 0); }
public static void MPIKaratsubaWorker() { Multiplications.MPIKaratsubaMultiply(); }