/// <summary> /// Does not work with BinaryFormatter. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="comm"></param> /// <param name="inputArray"></param> /// <param name="indicesToSend"></param> /// <param name="outputArray"></param> /// <param name="indicesToReceive"></param> public static void AlltoallSubarrays2 <T>(ICommunicator comm, IReadOnlyList <T> inputArray, ICollection <int>[] indicesToSend, IList <T> outputArray, ICollection <int>[] indicesToReceive) { var sendCounts = indicesToSend.Select(indices => indices.Count).ToArray(); var subarrays = Util.ArrayInit(indicesToSend.Length, recipient => (ICollection <T>) new Subarray <T>(inputArray, indicesToSend[recipient])); var sendTotalCount = sendCounts.Sum(); var recvCounts = indicesToReceive.Select(indices => indices.Count).ToArray(); var recvTotalCount = recvCounts.Sum(); AlltoallSubarraysItemsTransmitted += sendTotalCount + recvTotalCount; ICollection <T>[] subarraysReceived = comm.Alltoall(subarrays); for (int source = 0; source < comm.Size; source++) { var indicesOfSubarray = indicesToReceive[source]; if (indicesOfSubarray.Count == 0) { continue; } var iter = subarraysReceived[source].GetEnumerator(); foreach (int index in indicesOfSubarray) { if (!iter.MoveNext()) { throw new Exception(); } outputArray[index] = iter.Current; //Trace.WriteLine($"process {comm.Rank} from {source} received {outputArray[index]} for local index {index} recvPosition = {recvPosition}"); } } }