/// <summary> /// Performs IMRU iterations on map side /// </summary> /// <returns></returns> protected override byte[] TaskBody(byte[] memento) { MapControlMessage controlMessage = MapControlMessage.AnotherRound; while (!_cancellationSource.IsCancellationRequested && controlMessage != MapControlMessage.Stop) { if (_invokeGc) { Logger.Log(Level.Verbose, "Calling Garbage Collector"); GC.Collect(); GC.WaitForPendingFinalizers(); } using ( MapInputWithControlMessage <TMapInput> mapInput = _dataAndMessageReceiver.Receive(_cancellationSource)) { controlMessage = mapInput.ControlMessage; if (controlMessage != MapControlMessage.Stop) { TMapOutput output = default(TMapOutput); try { output = _mapTask.Map(mapInput.Message); } catch (Exception e) { HandleTaskAppException(e); } _dataReducer.Send(output, _cancellationSource); } } } return(null); }
public byte[] Call(byte[] memento) { for (int i = 0; i < _numIterations; i++) { // Receive n from Master Task int[] intVec = _broadcastReceiver.Receive(); Logger.Log(Level.Info, "Calculating TriangleNumber({0}) on slave task...", intVec[0]); // Calculate the nth Triangle number and send it back to driver int triangleNum = TriangleNumber(intVec[0]); Logger.Log(Level.Info, "Sending sum: {0} on iteration {1}.", triangleNum, i); int[] resArr = new int[intVec.Length]; for (int j = 0; j < resArr.Length; j++) { resArr[j] = triangleNum; } _triangleNumberSender.Send(resArr); } return(null); }
private static void ScatterReceiveReduce(IScatterReceiver <int> receiver, IReduceSender <int> sumSender) { List <int> data1 = receiver.Receive(); int sum1 = data1.Sum(); sumSender.Send(sum1); }
/// <summary> /// Performs IMRU iterations on map side /// </summary> /// <param name="memento"></param> /// <returns></returns> public byte[] Call(byte[] memento) { while (true) { if (_invokeGC) { Logger.Log(Level.Verbose, "Calling Garbage Collector"); GC.Collect(); GC.WaitForPendingFinalizers(); } TMapOutput result; using ( MapInputWithControlMessage <TMapInput> mapInput = _dataAndMessageReceiver.Receive()) { if (mapInput.ControlMessage == MapControlMessage.Stop) { break; } result = _mapTask.Map(mapInput.Message); } _dataReducer.Send(result); } return(null); }
public void TestReduceOperator() { string groupName = "group1"; string operatorName = "reduce"; int numTasks = 4; string driverId = "driverid"; string masterTaskId = "task0"; int fanOut = 2; IGroupCommDriver groupCommDriver = GetInstanceOfGroupCommDriver(driverId, masterTaskId, groupName, fanOut, numTasks); var commGroup = groupCommDriver.DefaultGroup .AddReduce <int>(operatorName, "task0", TopologyTypes.Flat, GetDefaultDataConverterConfig(), GetDefaultReduceFuncConfig()) .Build(); List <ICommunicationGroupClient> commGroups = CommGroupClients(groupName, numTasks, groupCommDriver, commGroup, GetDefaultCodecConfig()); IReduceReceiver <int> receiver = commGroups[0].GetReduceReceiver <int>(operatorName); IReduceSender <int> sender1 = commGroups[1].GetReduceSender <int>(operatorName); IReduceSender <int> sender2 = commGroups[2].GetReduceSender <int>(operatorName); IReduceSender <int> sender3 = commGroups[3].GetReduceSender <int>(operatorName); Assert.NotNull(receiver); Assert.NotNull(sender1); Assert.NotNull(sender2); Assert.NotNull(sender3); sender3.Send(5); sender1.Send(1); sender2.Send(3); Assert.Equal(9, receiver.Reduce()); }
public byte[] Call(byte[] memento) { _groupCommClient.Initialize(); Stopwatch broadcastTime = new Stopwatch(); Stopwatch reduceTime = new Stopwatch(); for (int i = 0; i < _numIterations; i++) { broadcastTime.Start(); // Receive n from Master Task int n = _broadcastReceiver.Receive(); broadcastTime.Stop(); Logger.Log(Level.Info, "Calculating TriangleNumber({0}) on slave task...", n); // Calculate the nth Triangle number and send it back to driver int triangleNum = TriangleNumber(n); Logger.Log(Level.Info, "Sending sum: {0} on iteration {1}.", triangleNum, i); reduceTime.Start(); _triangleNumberSender.Send(triangleNum); reduceTime.Stop(); if (i >= 1) { var msg = string.Format("Average time (milliseconds) taken for broadcast: {0} and reduce: {1}", broadcastTime.ElapsedMilliseconds / ((double)i), reduceTime.ElapsedMilliseconds / ((double)i)); Logger.Log(Level.Info, msg); } } return(null); }
/// <summary> /// Performs IMRU iterations on map side /// </summary> /// <param name="memento"></param> /// <returns></returns> public byte[] Call(byte[] memento) { MapControlMessage controlMessage = MapControlMessage.AnotherRound; while (!_taskCloseCoordinator.ShouldCloseTask() && controlMessage != MapControlMessage.Stop) { if (_invokeGC) { Logger.Log(Level.Verbose, "Calling Garbage Collector"); GC.Collect(); GC.WaitForPendingFinalizers(); } using ( MapInputWithControlMessage <TMapInput> mapInput = _dataAndMessageReceiver.Receive()) { controlMessage = mapInput.ControlMessage; if (controlMessage != MapControlMessage.Stop) { _dataReducer.Send(_mapTask.Map(mapInput.Message)); } } } _taskCloseCoordinator.SignalTaskStopped(); return(null); }
public void TestBroadcastReduceOperators() { string groupName = "group1"; string broadcastOperatorName = "broadcast"; string reduceOperatorName = "reduce"; string masterTaskId = "task0"; string driverId = "Driver Id"; int numTasks = 3; int fanOut = 2; var groupCommunicationDriver = GetInstanceOfGroupCommDriver(driverId, masterTaskId, groupName, fanOut, numTasks); ICommunicationGroupDriver commGroup = groupCommunicationDriver.DefaultGroup .AddBroadcast <int>( broadcastOperatorName, masterTaskId, TopologyTypes.Flat, GetDefaultDataConverterConfig()) .AddReduce <int>( reduceOperatorName, masterTaskId, TopologyTypes.Flat, GetDefaultDataConverterConfig(), GetDefaultReduceFuncConfig()) .Build(); var commGroups = CommGroupClients(groupName, numTasks, groupCommunicationDriver, commGroup, GetDefaultCodecConfig()); // for master task IBroadcastSender <int> broadcastSender = commGroups[0].GetBroadcastSender <int>(broadcastOperatorName); IReduceReceiver <int> sumReducer = commGroups[0].GetReduceReceiver <int>(reduceOperatorName); IBroadcastReceiver <int> broadcastReceiver1 = commGroups[1].GetBroadcastReceiver <int>(broadcastOperatorName); IReduceSender <int> triangleNumberSender1 = commGroups[1].GetReduceSender <int>(reduceOperatorName); IBroadcastReceiver <int> broadcastReceiver2 = commGroups[2].GetBroadcastReceiver <int>(broadcastOperatorName); IReduceSender <int> triangleNumberSender2 = commGroups[2].GetReduceSender <int>(reduceOperatorName); for (int j = 1; j <= 10; j++) { broadcastSender.Send(j); int n1 = broadcastReceiver1.Receive(); int n2 = broadcastReceiver2.Receive(); Assert.Equal(j, n1); Assert.Equal(j, n2); int triangleNum1 = TriangleNumber(n1); triangleNumberSender1.Send(triangleNum1); int triangleNum2 = TriangleNumber(n2); triangleNumberSender2.Send(triangleNum2); int sum = sumReducer.Reduce(); int expected = TriangleNumber(j) * (numTasks - 1); Assert.Equal(sum, expected); } }
/// <summary> /// Performs IMRU iterations on map side /// </summary> /// <param name="memento"></param> /// <returns></returns> public byte[] Call(byte[] memento) { MapControlMessage controlMessage = MapControlMessage.AnotherRound; while (!_cancellationSource.IsCancellationRequested && controlMessage != MapControlMessage.Stop) { if (_invokeGC) { Logger.Log(Level.Verbose, "Calling Garbage Collector"); GC.Collect(); GC.WaitForPendingFinalizers(); } try { using ( MapInputWithControlMessage <TMapInput> mapInput = _dataAndMessageReceiver.Receive(_cancellationSource)) { controlMessage = mapInput.ControlMessage; if (controlMessage != MapControlMessage.Stop) { _dataReducer.Send(_mapTask.Map(mapInput.Message), _cancellationSource); } } } catch (OperationCanceledException e) { Logger.Log(Level.Warning, "Received OperationCanceledException in MapTaskHost with message: {0}.", e.Message); break; } catch (IOException e) { Logger.Log(Level.Error, "Received IOException in MapTaskHost with message: {0}.", e.Message); if (!_cancellationSource.IsCancellationRequested) { throw new IMRUTaskGroupCommunicationException(TaskManager.TaskGroupCommunicationError); } break; } catch (TcpClientConnectionException e) { Logger.Log(Level.Error, "Received TcpClientConnectionException in MapTaskHost with message: {0}.", e.Message); if (!_cancellationSource.IsCancellationRequested) { throw new IMRUTaskGroupCommunicationException(TaskManager.TaskGroupCommunicationError); } break; } } _taskCloseCoordinator.SignalTaskStopped(); Logger.Log(Level.Info, "MapTaskHost returned with cancellation token:{0}.", _cancellationSource.IsCancellationRequested); return(null); }
public byte[] Call(byte[] memento) { List <int> data = _scatterReceiver.Receive(); _logger.Log(Level.Info, "Received data: {0}", string.Join(" ", data)); int sum = data.Sum(); _logger.Log(Level.Info, "Sending back sum: {0}", sum); _sumSender.Send(sum); return(null); }
public void TestReduceOperator() { string groupName = "group1"; string operatorName = "reduce"; int numTasks = 10; string driverId = "driverId"; string masterTaskId = "task0"; int fanOut = 3; var groupCommDriver = GroupCommunicationTests.GetInstanceOfGroupCommDriver(driverId, masterTaskId, groupName, fanOut, numTasks); ICommunicationGroupDriver commGroup = groupCommDriver.DefaultGroup .AddReduce <int>(operatorName, masterTaskId, TopologyTypes.Tree, GetDefaultDataConverterConfig(), GetDefaultReduceFuncConfig()) .Build(); var commGroups = GroupCommunicationTests.CommGroupClients(groupName, numTasks, groupCommDriver, commGroup, GetDefaultCodecConfig()); IReduceReceiver <int> receiver = commGroups[0].GetReduceReceiver <int>(operatorName); IReduceSender <int> sender1 = commGroups[1].GetReduceSender <int>(operatorName); IReduceSender <int> sender2 = commGroups[2].GetReduceSender <int>(operatorName); IReduceSender <int> sender3 = commGroups[3].GetReduceSender <int>(operatorName); IReduceSender <int> sender4 = commGroups[4].GetReduceSender <int>(operatorName); IReduceSender <int> sender5 = commGroups[5].GetReduceSender <int>(operatorName); IReduceSender <int> sender6 = commGroups[6].GetReduceSender <int>(operatorName); IReduceSender <int> sender7 = commGroups[7].GetReduceSender <int>(operatorName); IReduceSender <int> sender8 = commGroups[8].GetReduceSender <int>(operatorName); IReduceSender <int> sender9 = commGroups[9].GetReduceSender <int>(operatorName); Assert.NotNull(receiver); Assert.NotNull(sender1); Assert.NotNull(sender2); Assert.NotNull(sender3); Assert.NotNull(sender4); Assert.NotNull(sender5); Assert.NotNull(sender6); Assert.NotNull(sender7); Assert.NotNull(sender8); Assert.NotNull(sender9); sender9.Send(9); sender8.Send(8); sender7.Send(7); sender6.Send(6); sender5.Send(5); sender4.Send(4); sender3.Send(3); sender2.Send(2); sender1.Send(1); Assert.Equal(45, receiver.Reduce()); }
public byte[] Call(byte[] memento) { int[] resArr = new int[_arraySize]; for (int j = 0; j < resArr.Length; j++) { resArr[j] = j; } Stopwatch broadcastTime = new Stopwatch(); Stopwatch reduceTime = new Stopwatch(); for (int i = 0; i < _numIterations; i++) { if (i == 1) { broadcastTime.Reset(); reduceTime.Reset(); } broadcastTime.Start(); // Receive n from Master Task int[] intVec = _broadcastReceiver.Receive(); broadcastTime.Stop(); Logger.Log(Level.Info, "Calculating TriangleNumber({0}) on slave task...", intVec[0]); // Calculate the nth Triangle number and send it back to driver int triangleNum = TriangleNumber(intVec[0]); Logger.Log(Level.Info, "Sending sum: {0} on iteration {1}.", triangleNum, i); resArr[0] = triangleNum; reduceTime.Start(); _triangleNumberSender.Send(resArr); reduceTime.Stop(); if (i >= 1) { var msg = string.Format("Average time (milliseconds) taken for broadcast: {0} and reduce: {1}", broadcastTime.ElapsedMilliseconds / ((double)i), reduceTime.ElapsedMilliseconds / ((double)i)); Logger.Log(Level.Info, msg); } } return(null); }
public byte[] Call(byte[] memento) { for (int i = 0; i < _numIterations; i++) { // Receive n from Master Task int n = _broadcastReceiver.Receive(); _logger.Log(Level.Info, "Calculating TriangleNumber({0}) on slave task...", n); // Calculate the nth Triangle number and send it back to driver int triangleNum = TriangleNumber(n); _logger.Log(Level.Info, "Sending sum: {0} on iteration {1}.", triangleNum, i); _triangleNumberSender.Send(triangleNum); } return(null); }
public byte[] Call(byte[] memento) { while (true) { if (_controlBroadcastReceiver.Receive() == ControlMessage.STOP) { break; } Centroids centroids = _dataBroadcastReceiver.Receive(); // we compute the loss here before data is relabled, this does not reflect the latest clustering result at the end of current iteration, // but it will save another round of group communications in each iteration _logger.Log(Level.Info, "Received centroids from master: " + centroids); _dataPartition.LabelData(centroids); ProcessedResults partialMeans = new ProcessedResults(ComputePartialMeans(), ComputeLossFunction(centroids, _dataPartition.DataVectors)); _logger.Log(Level.Info, "Sending partial means: " + partialMeans); _partialMeansSender.Send(partialMeans); } return(null); }
public void TestScatterReduceOperatorsWithCancelation() { string groupName = "group1"; string scatterOperatorName = "scatter"; string reduceOperatorName = "reduce"; string masterTaskId = "task0"; string driverId = "Driver Id"; int numTasks = 5; int fanOut = 2; var groupCommDriver = GroupCommunicationTests.GetInstanceOfGroupCommDriver(driverId, masterTaskId, groupName, fanOut, numTasks); ICommunicationGroupDriver commGroup = groupCommDriver.DefaultGroup .AddScatter <int>( scatterOperatorName, masterTaskId, TopologyTypes.Tree, GetDefaultDataConverterConfig()) .AddReduce <int>( reduceOperatorName, masterTaskId, TopologyTypes.Tree, GetDefaultDataConverterConfig(), GetDefaultReduceFuncConfig()) .Build(); var commGroups = GroupCommunicationTests.CommGroupClients(groupName, numTasks, groupCommDriver, commGroup, GetDefaultCodecConfig()); IScatterSender <int> sender = commGroups[0].GetScatterSender <int>(scatterOperatorName); IReduceReceiver <int> sumReducer = commGroups[0].GetReduceReceiver <int>(reduceOperatorName); IScatterReceiver <int> receiver1 = commGroups[1].GetScatterReceiver <int>(scatterOperatorName); IReduceSender <int> sumSender1 = commGroups[1].GetReduceSender <int>(reduceOperatorName); IScatterReceiver <int> receiver2 = commGroups[2].GetScatterReceiver <int>(scatterOperatorName); IReduceSender <int> sumSender2 = commGroups[2].GetReduceSender <int>(reduceOperatorName); IScatterReceiver <int> receiver3 = commGroups[3].GetScatterReceiver <int>(scatterOperatorName); IReduceSender <int> sumSender3 = commGroups[3].GetReduceSender <int>(reduceOperatorName); IScatterReceiver <int> receiver4 = commGroups[4].GetScatterReceiver <int>(scatterOperatorName); IReduceSender <int> sumSender4 = commGroups[4].GetReduceSender <int>(reduceOperatorName); Assert.NotNull(sender); Assert.NotNull(receiver1); Assert.NotNull(receiver2); Assert.NotNull(receiver3); Assert.NotNull(receiver4); List <int> data = Enumerable.Range(1, 100).ToList(); sender.Send(data); List <int> data1 = receiver1.Receive(); List <int> data2 = receiver2.Receive(); List <int> data3 = receiver3.Receive(); List <int> data4 = receiver4.Receive(); int sum3 = data3.Sum(); sumSender3.Send(sum3); int sum4 = data4.Sum(); sumSender4.Send(sum4); int sum2 = data2.Sum(); sumSender2.Send(sum2); int sum1 = data1.Sum(); var token = new CancellationTokenSource(); token.Cancel(); Action send = () => sumSender1.Send(sum1, token); Assert.Throws <OperationCanceledException>(send); var taskThread = new Thread(() => { Action reduce = () => sumReducer.Reduce(token); Assert.Throws <OperationCanceledException>(reduce); }); taskThread.Start(); token.Cancel(); }
public void TestBroadcastReduceOperators() { string groupName = "group1"; string broadcastOperatorName = "broadcast"; string reduceOperatorName = "reduce"; string masterTaskId = "task0"; string driverId = "Driver Id"; int numTasks = 10; int fanOut = 3; var groupCommDriver = GroupCommunicationTests.GetInstanceOfGroupCommDriver(driverId, masterTaskId, groupName, fanOut, numTasks); ICommunicationGroupDriver commGroup = groupCommDriver.DefaultGroup .AddBroadcast <int>( broadcastOperatorName, masterTaskId, TopologyTypes.Tree, GetDefaultDataConverterConfig()) .AddReduce <int>( reduceOperatorName, masterTaskId, TopologyTypes.Tree, GetDefaultDataConverterConfig(), GetDefaultReduceFuncConfig()) .Build(); var commGroups = GroupCommunicationTests.CommGroupClients(groupName, numTasks, groupCommDriver, commGroup, GetDefaultCodecConfig()); // for master task IBroadcastSender <int> broadcastSender = commGroups[0].GetBroadcastSender <int>(broadcastOperatorName); IReduceReceiver <int> sumReducer = commGroups[0].GetReduceReceiver <int>(reduceOperatorName); IBroadcastReceiver <int> broadcastReceiver1 = commGroups[1].GetBroadcastReceiver <int>(broadcastOperatorName); IReduceSender <int> triangleNumberSender1 = commGroups[1].GetReduceSender <int>(reduceOperatorName); IBroadcastReceiver <int> broadcastReceiver2 = commGroups[2].GetBroadcastReceiver <int>(broadcastOperatorName); IReduceSender <int> triangleNumberSender2 = commGroups[2].GetReduceSender <int>(reduceOperatorName); IBroadcastReceiver <int> broadcastReceiver3 = commGroups[3].GetBroadcastReceiver <int>(broadcastOperatorName); IReduceSender <int> triangleNumberSender3 = commGroups[3].GetReduceSender <int>(reduceOperatorName); IBroadcastReceiver <int> broadcastReceiver4 = commGroups[4].GetBroadcastReceiver <int>(broadcastOperatorName); IReduceSender <int> triangleNumberSender4 = commGroups[4].GetReduceSender <int>(reduceOperatorName); IBroadcastReceiver <int> broadcastReceiver5 = commGroups[5].GetBroadcastReceiver <int>(broadcastOperatorName); IReduceSender <int> triangleNumberSender5 = commGroups[5].GetReduceSender <int>(reduceOperatorName); IBroadcastReceiver <int> broadcastReceiver6 = commGroups[6].GetBroadcastReceiver <int>(broadcastOperatorName); IReduceSender <int> triangleNumberSender6 = commGroups[6].GetReduceSender <int>(reduceOperatorName); IBroadcastReceiver <int> broadcastReceiver7 = commGroups[7].GetBroadcastReceiver <int>(broadcastOperatorName); IReduceSender <int> triangleNumberSender7 = commGroups[7].GetReduceSender <int>(reduceOperatorName); IBroadcastReceiver <int> broadcastReceiver8 = commGroups[8].GetBroadcastReceiver <int>(broadcastOperatorName); IReduceSender <int> triangleNumberSender8 = commGroups[8].GetReduceSender <int>(reduceOperatorName); IBroadcastReceiver <int> broadcastReceiver9 = commGroups[9].GetBroadcastReceiver <int>(broadcastOperatorName); IReduceSender <int> triangleNumberSender9 = commGroups[9].GetReduceSender <int>(reduceOperatorName); for (int i = 1; i <= 10; i++) { broadcastSender.Send(i); int n1 = broadcastReceiver1.Receive(); int n2 = broadcastReceiver2.Receive(); int n3 = broadcastReceiver3.Receive(); int n4 = broadcastReceiver4.Receive(); int n5 = broadcastReceiver5.Receive(); int n6 = broadcastReceiver6.Receive(); int n7 = broadcastReceiver7.Receive(); int n8 = broadcastReceiver8.Receive(); int n9 = broadcastReceiver9.Receive(); Assert.Equal(i, n1); Assert.Equal(i, n2); Assert.Equal(i, n3); Assert.Equal(i, n4); Assert.Equal(i, n5); Assert.Equal(i, n6); Assert.Equal(i, n7); Assert.Equal(i, n8); Assert.Equal(i, n9); int triangleNum9 = GroupCommunicationTests.TriangleNumber(n9); triangleNumberSender9.Send(triangleNum9); int triangleNum8 = GroupCommunicationTests.TriangleNumber(n8); triangleNumberSender8.Send(triangleNum8); int triangleNum7 = GroupCommunicationTests.TriangleNumber(n7); triangleNumberSender7.Send(triangleNum7); int triangleNum6 = GroupCommunicationTests.TriangleNumber(n6); triangleNumberSender6.Send(triangleNum6); int triangleNum5 = GroupCommunicationTests.TriangleNumber(n5); triangleNumberSender5.Send(triangleNum5); int triangleNum4 = GroupCommunicationTests.TriangleNumber(n4); triangleNumberSender4.Send(triangleNum4); int triangleNum3 = GroupCommunicationTests.TriangleNumber(n3); triangleNumberSender3.Send(triangleNum3); int triangleNum2 = GroupCommunicationTests.TriangleNumber(n2); triangleNumberSender2.Send(triangleNum2); int triangleNum1 = GroupCommunicationTests.TriangleNumber(n1); triangleNumberSender1.Send(triangleNum1); int sum = sumReducer.Reduce(); int expected = GroupCommunicationTests.TriangleNumber(i) * (numTasks - 1); Assert.Equal(sum, expected); } }
public void TestScatterReduceOperators() { string groupName = "group1"; string scatterOperatorName = "scatter"; string reduceOperatorName = "reduce"; string masterTaskId = "task0"; string driverId = "Driver Id"; int numTasks = 5; int fanOut = 2; var groupCommDriver = GroupCommunicationTests.GetInstanceOfGroupCommDriver(driverId, masterTaskId, groupName, fanOut, numTasks); ICommunicationGroupDriver commGroup = groupCommDriver.DefaultGroup .AddScatter <int>( scatterOperatorName, masterTaskId, TopologyTypes.Tree, GetDefaultDataConverterConfig()) .AddReduce <int>( reduceOperatorName, masterTaskId, TopologyTypes.Tree, GetDefaultDataConverterConfig(), GetDefaultReduceFuncConfig()) .Build(); var commGroups = GroupCommunicationTests.CommGroupClients(groupName, numTasks, groupCommDriver, commGroup, GetDefaultCodecConfig()); IScatterSender <int> sender = commGroups[0].GetScatterSender <int>(scatterOperatorName); IReduceReceiver <int> sumReducer = commGroups[0].GetReduceReceiver <int>(reduceOperatorName); IScatterReceiver <int> receiver1 = commGroups[1].GetScatterReceiver <int>(scatterOperatorName); IReduceSender <int> sumSender1 = commGroups[1].GetReduceSender <int>(reduceOperatorName); IScatterReceiver <int> receiver2 = commGroups[2].GetScatterReceiver <int>(scatterOperatorName); IReduceSender <int> sumSender2 = commGroups[2].GetReduceSender <int>(reduceOperatorName); IScatterReceiver <int> receiver3 = commGroups[3].GetScatterReceiver <int>(scatterOperatorName); IReduceSender <int> sumSender3 = commGroups[3].GetReduceSender <int>(reduceOperatorName); IScatterReceiver <int> receiver4 = commGroups[4].GetScatterReceiver <int>(scatterOperatorName); IReduceSender <int> sumSender4 = commGroups[4].GetReduceSender <int>(reduceOperatorName); Assert.IsNotNull(sender); Assert.IsNotNull(receiver1); Assert.IsNotNull(receiver2); Assert.IsNotNull(receiver3); Assert.IsNotNull(receiver4); List <int> data = Enumerable.Range(1, 100).ToList(); sender.Send(data); List <int> data1 = receiver1.Receive(); List <int> data2 = receiver2.Receive(); List <int> data3 = receiver3.Receive(); List <int> data4 = receiver4.Receive(); int sum3 = data3.Sum(); sumSender3.Send(sum3); int sum4 = data4.Sum(); sumSender4.Send(sum4); int sum2 = data2.Sum(); sumSender2.Send(sum2); int sum1 = data1.Sum(); sumSender1.Send(sum1); int sum = sumReducer.Reduce(); Assert.AreEqual(sum, 6325); }