Esempio n. 1
0
 public IORequest(uint streamID, ulong initiationTime, ulong LSN, uint requestDataSizeInSubpages, IORequestType type)
 {
     this.StreamID            = streamID;
     this.InitiationTime      = initiationTime;
     this.LSN                 = LSN;
     this.SizeInByte          = requestDataSizeInSubpages * FTL.SubPageCapacity;
     this.SizeInSubpages      = requestDataSizeInSubpages;
     this.Type                = type;
     this.InternalRequestList = new InternalRequestLinkedList();
 }
Esempio n. 2
0
 public IORequest(ulong initiationTime, ulong LSN, uint requestDataSizeInSubpages, IORequestType type) : this(AddressMappingModule.DefaultStreamID, initiationTime, LSN, requestDataSizeInSubpages, type)
 {
 }
        public override void ProcessXEvent(XEvent e)
        {
            switch ((HostInterfaceEventType)e.Type)
            {
            case HostInterfaceEventType.GenerateNextIORequest:
                IORequest request = null;

                IORequestType reqType = IORequestType.Write;
                if (randomRequestTypeGenerator.Uniform(0, 1) < readRatio)
                {
                    reqType = IORequestType.Read;
                    ReceivedReadRequestCount++;
                }
                else
                {
                    ReceivedWriteRequestCount++;
                }


                ulong lsn = 0;
                switch (addressDistributionType)
                {
                case InputStreamSynthetic.DistributionType.Uniform:
                    lsn = randomAddressGenerator1.UniformULong(addressDistributionParam1, addressDistributionParam2);
                    break;

                case InputStreamSynthetic.DistributionType.Normal:
                    double templsn = randomAddressGenerator1.Normal(addressDistributionParam1, addressDistributionParam2);
                    lsn = (uint)templsn;
                    if (templsn < 0)
                    {
                        lsn = 0;
                    }
                    else if (templsn > this.FTL.AddressMapper.LargestLSN)
                    {
                        lsn = this.FTL.AddressMapper.LargestLSN;
                    }
                    break;

                case InputStreamSynthetic.DistributionType.Fixed:
                    lsn = addressDistributionParam1;
                    break;

                case InputStreamSynthetic.DistributionType.HotCold:
                    if (randomHotColdRatioGenerator.Uniform(0, 1) < hotTrafficRate)
                    {
                        lsn = addressDistributionParam1 + randomHotAddressGenerator.UniformULong(0, hotAddressRange);
                    }
                    else
                    {
                        lsn = randomAddressGenerator1.UniformULong(0, this.FTL.AddressMapper.LargestLSN - hotAddressRange);
                        if (lsn > addressDistributionParam1)
                        {
                            lsn += hotAddressRange;
                        }
                    }
                    break;

                default:
                    throw new Exception("Unknown distribution type for address.");
                }

                uint reqSize = 0;
                switch (requestSizeDistributionType)
                {
                case InputStreamSynthetic.DistributionType.Uniform:
                    double tempReqSize = randomRequestSizeGenerator.Uniform(requestSizeDistributionParam1B, requestSizeDistributionParam2B);
                    reqSize = (uint)(Math.Ceiling(tempReqSize / (double)FTL.SubPageCapacity));
                    if (reqSize == 0)
                    {
                        reqSize = 1;
                    }
                    break;

                case InputStreamSynthetic.DistributionType.Normal:
                    tempReqSize = randomRequestSizeGenerator.Normal(requestSizeDistributionParam1B, requestSizeDistributionParam2B);
                    reqSize     = (uint)(Math.Ceiling(tempReqSize / (double)FTL.SubPageCapacity));
                    if (tempReqSize < 0)
                    {
                        reqSize = 1;
                    }
                    break;

                case InputStreamSynthetic.DistributionType.Fixed:
                    reqSize = (uint)(Math.Ceiling(requestSizeDistributionParam1B / (double)FTL.SubPageCapacity));
                    break;

                default:
                    throw new Exception("Uknown distribution type for requset size.");
                }

                request = new IORequest(XEngineFactory.XEngine.Time, lsn, reqSize, reqType);

                ReceivedRequestCount++;
                if (NCQ.Count < NCQSize)
                {
                    request.RelatedNodeInList = NCQ.AddLast(request);
                    SegmentIORequestNoCache_Sprinkler(request);
                    FTL.IOScheduler.Schedule((uint)StreamPriorityClass.Urgent, AddressMappingModule.DefaultStreamID);
                    //FTL.ServiceIORequest();
                }
                else
                {
                    HostQueue.AddLast(request);
                }

                if (ReceivedRequestCount < numberOfRequestsToBeSeen)
                {
                    nextRequetArrivalTime = XEngineFactory.XEngine.Time + (ulong)(randomTimeIntervalGenerator.Exponential(averageRequestInterArrivalTime));
                    XEngineFactory.XEngine.EventList.InsertXEvent(new XEvent(nextRequetArrivalTime, this, null, 0));
                }
                break;

            case HostInterfaceEventType.RequestCompletedByDRAM:
                IORequest targetRequest = e.Parameters as IORequest;
                SendEarlyResponseToHost(targetRequest);
                break;

            default:
                throw new Exception("Unhandled XEvent type");
            }
        }
Esempio n. 4
0
        public override IORequest GetNextIORequest(HostInterface hostInterface, bool foldAddress, bool ignoreUnallocatedReads)
        {
            ReceivedRequestCount++;
            IORequestType reqType = IORequestType.Write;

            if (randomRequestTypeGenerator.Uniform(0, 1) < readRatio)
            {
                reqType = IORequestType.Read;
                ReceivedReadRequestCount++;
            }
            else
            {
                ReceivedWriteRequestCount++;
            }

            ulong lsn = 0;

            switch (addressDistributionType)
            {
            case DistributionType.Uniform:
                lsn = randomAddressGenerator1.UniformULong((ulong)(_addressDistributionParam1 * AddressMappingDomain.LargestLSN)
                                                           , ((ulong)_addressDistributionParam2 * AddressMappingDomain.LargestLSN));
                break;

            case DistributionType.Normal:
                double templsn = randomAddressGenerator1.Normal(_addressDistributionParam1, _addressDistributionParam2);
                lsn = (uint)templsn;
                if (templsn < 0)
                {
                    lsn = 0;
                }
                else if (templsn > AddressMappingDomain.LargestLSN)
                {
                    lsn = AddressMappingDomain.LargestLSN;
                }
                break;

            case DistributionType.HotCold:
                if (randomHotColdRatioGenerator.Uniform(0, 1) < hotTrafficRate)
                {
                    lsn = _addressDistributionParam1 + randomHotAddressGenerator.UniformULong(0, hotAddressRange);
                }
                else
                {
                    lsn = randomAddressGenerator1.UniformULong(0, AddressMappingDomain.LargestLSN - hotAddressRange);
                    if (lsn > _addressDistributionParam1)
                    {
                        lsn += hotAddressRange;
                    }
                }
                break;

            case DistributionType.Fixed:
            default:
                throw new Exception("Unknown distribution type for address.");
            }

            uint reqSize = 0;

            switch (requestSizeDistributionType)
            {
            case DistributionType.Uniform:
                double tempReqSize = randomRequestSizeGenerator.Uniform(_requestSizeDistributionParam1Sector, _requestSizeDistributionParam2Sector);
                reqSize = (uint)(Math.Ceiling(tempReqSize));
                if (reqSize == 0)
                {
                    reqSize = 1;
                }
                break;

            case DistributionType.Normal:
                tempReqSize = randomRequestSizeGenerator.Normal(_requestSizeDistributionParam1Sector, _requestSizeDistributionParam2Sector);
                reqSize     = (uint)(Math.Ceiling(tempReqSize));
                if (tempReqSize < 0)
                {
                    reqSize = 1;
                }
                break;

            case DistributionType.Fixed:
                reqSize = _requestSizeDistributionParam1Sector;
                break;

            default:
                throw new Exception("Uknown distribution type for requset size.");
            }

            IORequest request = new IORequest(XEngineFactory.XEngine.Time, lsn, reqSize, reqType);

            request.RelatedNodeInList = SubmissionQueue.AddLast(request);
            if (HeadRequest == null)
            {
                HeadRequest = request.RelatedNodeInList;
            }
            if (ReceivedRequestCount < NumberOfRequestsToGenerate)
            {
                nextRequetArrivalTime = XEngineFactory.XEngine.Time + (ulong)(randomTimeIntervalGenerator.Exponential(averageRequestInterArrivalTime));
                if (nextRequetArrivalTime <= SimulationStopTime)
                {
                    XEngineFactory.XEngine.EventList.InsertXEvent(new XEvent(nextRequetArrivalTime, hostInterface, _id, 0));
                }
            }
            return(request);
        }