public static T MultiplyAll <T>(ICommunicator comm, T value) where T : ICloneable, SettableToProduct <T> { string key = StringUtil.TypeToString(typeof(T)); TimingInfo timingInfo; lock (MultiplyAllTimingInfos) { if (!MultiplyAllTimingInfos.TryGetValue(key, out timingInfo)) { timingInfo = new TimingInfo(); MultiplyAllTimingInfos.Add(key, timingInfo); } } timingInfo.watch.Start(); var reduced = comm.Allreduce(value, (a, b) => { T result = (T)a.Clone(); result.SetToProduct(a, b); return(result); }); timingInfo.watch.Stop(); timingInfo.ItemsTransmitted++; return(reduced); }