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(); }
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"); } }
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); }