コード例 #1
0
        /// <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}");
                }
            }
        }