Esempio n. 1
0
            public void WaitAll(Communicator comm)
            {
                RequestList requests = new RequestList();
                Dictionary <Request, EventWaitHandle> waitHandles = new Dictionary <Request, EventWaitHandle>();
                Dictionary <Request, string>          requestTags = new Dictionary <Request, string>();
                DateTime startTime  = DateTime.UtcNow;
                int      nextMinute = 1;
                var      workItems  = comm.Serialization.WorkItems;

                while (pendingCount > 0 || workItems.Count > 0 || requests.Count > 0)
                {
                    RequestGenerator workItem;
                    if (workItems.TryDequeue(out workItem))
                    {
                        var request = workItem.generator();
                        requests.Add(request);
                        waitHandles.Add(request, workItem.waitHandle);
                        requestTags.Add(request, workItem.Tag);
                    }
                    else
                    {
                        var request = requests.TestAny();
                        if (request != null)
                        {
                            waitHandles[request].Set();
                            waitHandles.Remove(request);
                            requestTags.Remove(request);
                        }
                    }
                    var elapsed = DateTime.UtcNow - startTime;
                    if (elapsed.TotalMinutes > nextMinute)
                    {
                        StringBuilder sb = new StringBuilder();
                        if (requestTags.Count > 0)
                        {
                            sb.Append(": ");
                            bool firstTime = true;
                            foreach (var tag in requestTags.Values)
                            {
                                if (!firstTime)
                                {
                                    sb.Append(",");
                                }
                                sb.Append(tag);
                                firstTime = false;
                            }
                        }
                        comm.Serialization.WaitLogger?.Invoke($"Waiting on {pendingCount} pending tasks, {workItems.Count} work items, {requests.Count} requests{sb.ToString()}");
                        nextMinute++;
                    }
                }
                if (waitHandles.Count != 0)
                {
                    throw new Exception("waitHandles.Count != 0");
                }
            }
Esempio n. 2
0
    static void TestRequests(Intracommunicator comm, RequestList requestList)
    {
        int datum = comm.Rank;
        int expectedDatum = (comm.Rank + comm.Size - 1) % comm.Size;

        int[] intArraySendBuffer = new int[comm.Rank + 1];
        string[] strArraySendBuffer = new string[comm.Rank + 1];
        for (int i = 0; i <= comm.Rank; ++i)
        {
            intArraySendBuffer[i] = i;
            strArraySendBuffer[i] = i.ToString();
        }

        int[] intArrayRecvBuffer = new int[expectedDatum + 1];
        string[] strArrayRecvBuffer = new string[expectedDatum + 1];
        Request[] requests = new Request[8];
        requests[0] = comm.ImmediateReceive<int>(Communicator.anySource, 0);
        requests[1] = comm.ImmediateReceive<string>(Communicator.anySource, 1);
        requests[2] = comm.ImmediateReceive(Communicator.anySource, 2, intArrayRecvBuffer);
        requests[3] = comm.ImmediateReceive(Communicator.anySource, 3, strArrayRecvBuffer);
        requests[4] = comm.ImmediateSend(datum, (comm.Rank + 1) % comm.Size, 0);
        requests[5] = comm.ImmediateSend(datum.ToString(), (comm.Rank + 1) % comm.Size, 1);
        requests[6] = comm.ImmediateSend(intArraySendBuffer, (comm.Rank + 1) % comm.Size, 2);
        requests[7] = comm.ImmediateSend(strArraySendBuffer, (comm.Rank + 1) % comm.Size, 3);

        if (requestList == null)
        {
            // Complete all communications manually
            bool allDone = false;
            while (!allDone)
            {
                allDone = true;
                for (int i = 0; i < requests.Length; ++i)
                    allDone = allDone && requests[i].Test() != null;
            }
        }
        else
        {
            // Use the request list to complete all communications
            for (int i = 0; i < requests.Length; ++i)
                requestList.Add(requests[i]);
            requestList.WaitAll();
        }

        ReceiveRequest intRecv = (ReceiveRequest)requests[0];
        CompletedStatus intStatus = intRecv.Wait();
        if ((int)intRecv.GetValue() != expectedDatum
            || intStatus.Source != expectedDatum
            || intStatus.Tag != 0)
        {
            System.Console.Error.WriteLine("error in non-blocking receive of integer: got " + (int)intRecv.GetValue() + " from " 
                + intStatus.Source + " on tag " + intStatus.Tag + ", expected " + expectedDatum);
            MPI.Environment.Abort(-1);
        }

        ReceiveRequest strRecv = (ReceiveRequest)requests[1];
        CompletedStatus strStatus = strRecv.Wait();
        if ((string)strRecv.GetValue() != expectedDatum.ToString()
            || strStatus.Source != expectedDatum
            || strStatus.Tag != 1)
        {
            System.Console.Error.WriteLine("error in non-blocking receive of string: got " + strRecv.GetValue() + " from "
            + strStatus.Source + " on tag " + strStatus.Tag + ", expected " + expectedDatum);
            MPI.Environment.Abort(-1);
        }

        ReceiveRequest intArrayRecv = (ReceiveRequest)requests[2];
        CompletedStatus intArrayStatus = intArrayRecv.Wait();
        if (intArrayRecv.GetValue() != intArrayRecvBuffer
            || intArrayStatus.Source != expectedDatum
            || intArrayStatus.Tag != 2 )
        {
            System.Console.WriteLine("error: received into the wrong integer array");
            MPI.Environment.Abort(-1);
        }
        for (int i = 0; i <= expectedDatum; ++i)
        {
            if (intArrayRecvBuffer[i] != i)
            {
                System.Console.WriteLine("error: intArrayRecv[" + i + "] is " + intArrayRecvBuffer[i] + ", expected " + i);
                MPI.Environment.Abort(-1);
            }
        }

        ReceiveRequest strArrayRecv = (ReceiveRequest)requests[3];
        CompletedStatus strArrayStatus = strArrayRecv.Wait();
        if (strArrayRecv.GetValue() != strArrayRecvBuffer
            || strArrayStatus.Source != expectedDatum
            || strArrayStatus.Tag != 3)
        {
            System.Console.WriteLine("error: received into the wrong string array");
            MPI.Environment.Abort(-1);
        }
        for (int i = 0; i <= expectedDatum; ++i)
        {
            if (strArrayRecvBuffer[i] != i.ToString())
            {
                System.Console.WriteLine("error: strArrayRecv[" + i + "] is " + strArrayRecvBuffer[i] + ", expected " + i.ToString());
                MPI.Environment.Abort(-1);
            }
        }    
    }