RDK 2.0
This commit is contained in:
parent
4e1c631ec8
commit
db9d77760c
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,8 +1,6 @@
|
|||
<!--
|
||||
###############################################################################
|
||||
#
|
||||
# Microsoft Research Singularity
|
||||
#
|
||||
# Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
#
|
||||
###############################################################################
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
// ----------------------------------------------------------------------------
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
//
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
using System;
|
||||
using System.Text;
|
||||
|
|
|
@ -5,9 +5,7 @@
|
|||
|
||||
Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
|
||||
File: Applications\Applications.proj
|
||||
|
||||
Note: This file is a convenience project for building all projects under
|
||||
Applications. This file is not involved in building "distro" projects.
|
||||
|
||||
##############################################################################
|
||||
|
@ -18,7 +16,7 @@
|
|||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="Runtime\AppRuntime.proj"/>
|
||||
<ProjectReference Include="*\*.proj;*\*.csproj" Exclude="Runtime\*;Pong\Pong.csproj"/>
|
||||
<ProjectReference Include="*\*.proj;*\*.csproj" Exclude="cassinin\cassinin.csproj;Runtime\*;Pong\Pong.csproj;Namespace\AtomicTestDSP\AtomicTestDSP.csproj"/>
|
||||
</ItemGroup>
|
||||
|
||||
<Import Project="$(SINGULARITY_ROOT)\Targets\Dirs.targets"/>
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<!-- Copyright (c) Microsoft Corporation. All rights reserved. -->
|
||||
<Import Project="..\..\..\..\Paths.targets" />
|
||||
|
||||
<PropertyGroup>
|
||||
|
|
|
@ -4,8 +4,6 @@
|
|||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
//
|
||||
// File: BartokP.sg
|
||||
//
|
||||
// Note: Compiler Phase
|
||||
//
|
||||
|
||||
|
@ -95,10 +93,9 @@ namespace Bartok.Child
|
|||
uint region;
|
||||
regionSize = (uint)bytes.Length;
|
||||
unsafe {
|
||||
fixed (byte *pdst = &bytes[0]) {
|
||||
region = (uint)pdst;
|
||||
cs.ReadOpen(region, regionSize);
|
||||
}
|
||||
byte *pdst = &bytes[0];
|
||||
region = (uint)pdst;
|
||||
cs.ReadOpen(region, regionSize);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -119,10 +116,9 @@ namespace Bartok.Child
|
|||
uint region;
|
||||
regionSize = (uint)bytes.Length;
|
||||
unsafe {
|
||||
fixed (byte *pdst = &bytes[0]) {
|
||||
region = (uint)pdst;
|
||||
cs.WriteOpen(region, regionSize);
|
||||
}
|
||||
byte *pdst = &bytes[0];
|
||||
region = (uint)pdst;
|
||||
cs.WriteOpen(region, regionSize);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<!-- Copyright (c) Microsoft Corporation. All rights reserved. -->
|
||||
<Import Project="..\..\..\..\Paths.targets" />
|
||||
|
||||
<PropertyGroup>
|
||||
|
|
|
@ -4,8 +4,6 @@
|
|||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
//
|
||||
// File: CompilerPhaseContract.sg
|
||||
//
|
||||
|
||||
using Microsoft.Singularity.Channels;
|
||||
using Microsoft.Singularity.Endpoint;
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
|
|
@ -0,0 +1,8 @@
|
|||
Hosted Bartok requires the following change to System\RuntimeType.cs:
|
||||
|
||||
public override int GetHashCode() {
|
||||
return unchecked((int)(
|
||||
(int)Magic.addressOf(this.classVtable)
|
||||
+ ((int)this.classVtable.arrayOf << 8 + rank)
|
||||
+ (int)this.classVtable.structuralView));
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
//
|
||||
|
||||
#define NONONNULLTYPECHECK // required on Singularity, no affect on other Windows.
|
||||
|
@ -422,25 +422,25 @@ namespace Bartok {
|
|||
analysisRegistry));
|
||||
}
|
||||
|
||||
/*
|
||||
phases.Add
|
||||
(new DynamicCount
|
||||
("VirtualCallsStart",
|
||||
new DynamicCount.OpcodeFilter
|
||||
(Operator.OpCodes.CallVirtual,
|
||||
Operator.OpCodes.InterfaceCall),
|
||||
DynamicCount.Granularity.PerSite));
|
||||
*/
|
||||
//
|
||||
//phases.Add
|
||||
// (new DynamicCount
|
||||
// ("VirtualCallsStart",
|
||||
// new DynamicCount.OpcodeFilter
|
||||
// (Operator.OpCodes.CallVirtual,
|
||||
// Operator.OpCodes.InterfaceCall),
|
||||
// DynamicCount.Granularity.PerSite));
|
||||
//
|
||||
|
||||
/*
|
||||
phases.Add
|
||||
(new DynamicCount
|
||||
("ASCstart",
|
||||
new DynamicCount.OpcodeFilter
|
||||
(Operator.OpCodes.CheckArrayStore,
|
||||
Operator.OpCodes.CheckVectorStore),
|
||||
DynamicCount.Granularity.PerSite));
|
||||
*/
|
||||
//
|
||||
//phases.Add
|
||||
// (new DynamicCount
|
||||
// ("ASCstart",
|
||||
// new DynamicCount.OpcodeFilter
|
||||
// (Operator.OpCodes.CheckArrayStore,
|
||||
// Operator.OpCodes.CheckVectorStore),
|
||||
// DynamicCount.Granularity.PerSite));
|
||||
//
|
||||
|
||||
if (StageControl.PtrAnalysis) {
|
||||
phases.Add(PtrTypeSimpleSystem.CreateAnalysis());
|
||||
|
@ -467,23 +467,23 @@ namespace Bartok {
|
|||
phases.Add(new Convert.ToMir(mask));
|
||||
}
|
||||
|
||||
/* SPOONS: region related phases:
|
||||
// A temporary pass that cleans up the scratch objects so that the
|
||||
// DemandAnalysis is not confused by the randomness that the tree
|
||||
// shaker leaves behind.
|
||||
phases.Add(new CleanScratch());
|
||||
|
||||
// Build a "Foo_layout" for each class "Foo"; other setup required
|
||||
// by DemandAnalysis.
|
||||
phases.Add(new LayoutBuilder());
|
||||
|
||||
// Perform first- and last-use analysis; add explicit region
|
||||
// variables and effects.
|
||||
phases.Add(new DemandAnalysis());
|
||||
|
||||
// Print the code
|
||||
phases.Add(new TypeDataPrettyPhase("After Demand:"));
|
||||
*/
|
||||
// SPOONS: region related phases:
|
||||
//// A temporary pass that cleans up the scratch objects so that the
|
||||
//// DemandAnalysis is not confused by the randomness that the tree
|
||||
//// shaker leaves behind.
|
||||
//phases.Add(new CleanScratch());
|
||||
//
|
||||
//// Build a "Foo_layout" for each class "Foo"; other setup required
|
||||
//// by DemandAnalysis.
|
||||
//phases.Add(new LayoutBuilder());
|
||||
//
|
||||
//// Perform first- and last-use analysis; add explicit region
|
||||
//// variables and effects.
|
||||
//phases.Add(new DemandAnalysis());
|
||||
//
|
||||
//// Print the code
|
||||
//phases.Add(new TypeDataPrettyPhase("After Demand:"));
|
||||
//
|
||||
|
||||
// Perform first- and last-use analysis; add explicit region
|
||||
// variables and effects.
|
||||
|
@ -774,67 +774,67 @@ namespace Bartok {
|
|||
(new Convert.ToMir(Convert.ToMir.Mask.Vararg2)));
|
||||
}
|
||||
|
||||
/*
|
||||
// We do not know where all of the calls will be because lowering can
|
||||
// introduce calls. We make a best guess here. If we moved all
|
||||
// call-generating lowering to HIR (via ToMir or equivalent), then
|
||||
// this could be easily done. We are currently missing calls for the
|
||||
// following:
|
||||
// - pinvoke, stubs, etc
|
||||
// - some arithmetic conversions
|
||||
// - casts - can't add because not all are calls
|
||||
// - RC, tryall, atomic
|
||||
// - others?
|
||||
phases.Add
|
||||
(new DynamicCount
|
||||
("Calls",
|
||||
new DynamicCount.OpcodeFilter
|
||||
(Operator.OpCodes.Call,
|
||||
Operator.OpCodes.CallIndirect,
|
||||
Operator.OpCodes.CallVirtual,
|
||||
Operator.OpCodes.InterfaceCall,
|
||||
Operator.OpCodes.MonitorEnter,
|
||||
Operator.OpCodes.MonitorExit,
|
||||
Operator.OpCodes.IndirectToData,
|
||||
Operator.OpCodes.CustomGetSize,
|
||||
Operator.OpCodes.CheckVectorStore,
|
||||
Operator.OpCodes.CheckVectorElementAddress,
|
||||
Operator.OpCodes.InitVector,
|
||||
Operator.OpCodes.CheckArrayStore,
|
||||
Operator.OpCodes.CheckArrayElementAddress,
|
||||
Operator.OpCodes.InitArray,
|
||||
Operator.OpCodes.InitType,
|
||||
Operator.OpCodes.GetITable,
|
||||
Operator.OpCodes.NewObject,
|
||||
Operator.OpCodes.NewVector,
|
||||
Operator.OpCodes.NewArray),
|
||||
DynamicCount.Granularity.Global));
|
||||
phases.Add(new TypeDataDummyPhase());
|
||||
phases.Add
|
||||
(new DynamicCount
|
||||
("VirtualCallsEnd",
|
||||
new DynamicCount.OpcodeFilter
|
||||
(Operator.OpCodes.CallVirtual,
|
||||
Operator.OpCodes.InterfaceCall),
|
||||
DynamicCount.Granularity.PerSite));
|
||||
|
||||
phases.Add
|
||||
(new DynamicCount
|
||||
("ASCend",
|
||||
new DynamicCount.OpcodeFilter
|
||||
(Operator.OpCodes.CheckArrayStore,
|
||||
Operator.OpCodes.CheckVectorStore),
|
||||
DynamicCount.Granularity.PerSite));
|
||||
phases.Add(new TypeDataDummyPhase());
|
||||
|
||||
phases.Add
|
||||
(new DynamicCount
|
||||
("WB",
|
||||
new DynamicCount.OpcodeFilter
|
||||
(Operator.OpCodes.LocWriteBarrier),
|
||||
DynamicCount.Granularity.Global));
|
||||
phases.Add(new TypeDataDummyPhase());
|
||||
*/
|
||||
//
|
||||
//// We do not know where all of the calls will be because lowering can
|
||||
//// introduce calls. We make a best guess here. If we moved all
|
||||
//// call-generating lowering to HIR (via ToMir or equivalent), then
|
||||
//// this could be easily done. We are currently missing calls for the
|
||||
//// following:
|
||||
//// - pinvoke, stubs, etc
|
||||
//// - some arithmetic conversions
|
||||
//// - casts - can't add because not all are calls
|
||||
//// - RC, tryall, atomic
|
||||
//// - others?
|
||||
//phases.Add
|
||||
// (new DynamicCount
|
||||
// ("Calls",
|
||||
// new DynamicCount.OpcodeFilter
|
||||
// (Operator.OpCodes.Call,
|
||||
// Operator.OpCodes.CallIndirect,
|
||||
// Operator.OpCodes.CallVirtual,
|
||||
// Operator.OpCodes.InterfaceCall,
|
||||
// Operator.OpCodes.MonitorEnter,
|
||||
// Operator.OpCodes.MonitorExit,
|
||||
// Operator.OpCodes.IndirectToData,
|
||||
// Operator.OpCodes.CustomGetSize,
|
||||
// Operator.OpCodes.CheckVectorStore,
|
||||
// Operator.OpCodes.CheckVectorElementAddress,
|
||||
// Operator.OpCodes.InitVector,
|
||||
// Operator.OpCodes.CheckArrayStore,
|
||||
// Operator.OpCodes.CheckArrayElementAddress,
|
||||
// Operator.OpCodes.InitArray,
|
||||
// Operator.OpCodes.InitType,
|
||||
// Operator.OpCodes.GetITable,
|
||||
// Operator.OpCodes.NewObject,
|
||||
// Operator.OpCodes.NewVector,
|
||||
// Operator.OpCodes.NewArray),
|
||||
// DynamicCount.Granularity.Global));
|
||||
//phases.Add(new TypeDataDummyPhase());
|
||||
//phases.Add
|
||||
// (new DynamicCount
|
||||
// ("VirtualCallsEnd",
|
||||
// new DynamicCount.OpcodeFilter
|
||||
// (Operator.OpCodes.CallVirtual,
|
||||
// Operator.OpCodes.InterfaceCall),
|
||||
// DynamicCount.Granularity.PerSite));
|
||||
//
|
||||
//phases.Add
|
||||
// (new DynamicCount
|
||||
// ("ASCend",
|
||||
// new DynamicCount.OpcodeFilter
|
||||
// (Operator.OpCodes.CheckArrayStore,
|
||||
// Operator.OpCodes.CheckVectorStore),
|
||||
// DynamicCount.Granularity.PerSite));
|
||||
//phases.Add(new TypeDataDummyPhase());
|
||||
//
|
||||
//phases.Add
|
||||
// (new DynamicCount
|
||||
// ("WB",
|
||||
// new DynamicCount.OpcodeFilter
|
||||
// (Operator.OpCodes.LocWriteBarrier),
|
||||
// DynamicCount.Granularity.Global));
|
||||
//phases.Add(new TypeDataDummyPhase());
|
||||
//
|
||||
|
||||
if (StageControl.WholeProgram && StageControl.OptRuntimeData) {
|
||||
phases.Add(new RuntimeData());
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<!-- Copyright (c) Microsoft Corporation. All rights reserved. -->
|
||||
<Import Project="..\..\..\..\Paths.targets" />
|
||||
|
||||
<PropertyGroup>
|
||||
|
|
|
@ -4,8 +4,6 @@
|
|||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
//
|
||||
// File: Proxy.sg
|
||||
//
|
||||
// Note: Compiler Phase
|
||||
//
|
||||
|
||||
|
@ -57,10 +55,9 @@ namespace Bartok.Regalloc
|
|||
uint region;
|
||||
regionSize = (uint)bytes.Length;
|
||||
unsafe {
|
||||
fixed (byte *pdst = &bytes[0]) {
|
||||
region = (uint)pdst;
|
||||
cs.ReadOpen(region, regionSize);
|
||||
}
|
||||
byte *pdst = &bytes[0];
|
||||
region = (uint)pdst;
|
||||
cs.ReadOpen(region, regionSize);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -81,10 +78,9 @@ namespace Bartok.Regalloc
|
|||
uint region;
|
||||
regionSize = (uint)bytes.Length;
|
||||
unsafe {
|
||||
fixed (byte *pdst = &bytes[0]) {
|
||||
region = (uint)pdst;
|
||||
cs.WriteOpen(region, regionSize);
|
||||
}
|
||||
byte *pdst = &bytes[0];
|
||||
region = (uint)pdst;
|
||||
cs.WriteOpen(region, regionSize);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -131,7 +127,7 @@ namespace Bartok.Regalloc
|
|||
|
||||
// Start up our child
|
||||
string[] args = new string[3];
|
||||
args[0] = "BartokP.x86";
|
||||
args[0] = "BartokP";
|
||||
args[1] = "-where";
|
||||
args[2] = "!";
|
||||
Process cproc = new Process(args, (Endpoint * in ExHeap)ep);
|
||||
|
@ -388,5 +384,5 @@ namespace Bartok.Regalloc
|
|||
private const string coloringName = "Back End Coloring Coloring";
|
||||
private static int coloringId;
|
||||
#endif
|
||||
} /* class GraphColoring */
|
||||
} // class GraphColoring
|
||||
}
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,3 +1,11 @@
|
|||
<!--
|
||||
###############################################################################
|
||||
#
|
||||
# Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
#
|
||||
###############################################################################
|
||||
-->
|
||||
|
||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
|
||||
<Import Project="..\..\Paths.targets"/>
|
||||
|
|
|
@ -4,8 +4,6 @@
|
|||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
//
|
||||
// File: CreateProcess.cs
|
||||
//
|
||||
// Note: Singularity micro-benchmark program.
|
||||
//
|
||||
using Microsoft.Singularity;
|
||||
|
@ -175,7 +173,7 @@ namespace Microsoft.Singularity.Applications
|
|||
public void Start()
|
||||
{
|
||||
if (!AtRing3) {
|
||||
disabled = Processor.DisableInterrupts();
|
||||
disabled = Processor.DisableLocalPreemption();
|
||||
}
|
||||
|
||||
int collectorCount;
|
||||
|
@ -218,7 +216,8 @@ namespace Microsoft.Singularity.Applications
|
|||
Reset(1, PerfEvtSel.COUNT | PerfEvtSel.RetiredInstructions);
|
||||
Reset(2, PerfEvtSel.COUNT | PerfEvtSel.RetiredBranchInstructions);
|
||||
Reset(3, PerfEvtSel.COUNT | PerfEvtSel.RequestsToL2Cache | 0x400);
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
// We're not allowed to reset the perf counters, so take note
|
||||
// of their current values; we will subtract from this later.
|
||||
x64_i0 = Processor.ReadPmc(0);
|
||||
|
@ -275,7 +274,7 @@ namespace Microsoft.Singularity.Applications
|
|||
endStackRets = stackRets;
|
||||
|
||||
if (!AtRing3) {
|
||||
Processor.RestoreInterrupts(disabled);
|
||||
Processor.RestoreLocalPreemption(disabled);
|
||||
}
|
||||
|
||||
this.iterations = iterations;
|
||||
|
@ -327,7 +326,8 @@ namespace Microsoft.Singularity.Applications
|
|||
EvtSelToString(e1),
|
||||
EvtSelToString(e2),
|
||||
EvtSelToString(e3)));
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
// Subtract from the initial perf-counter values to
|
||||
// get the delta we want
|
||||
x64_p0 -= x64_i0;
|
||||
|
@ -353,7 +353,7 @@ namespace Microsoft.Singularity.Applications
|
|||
string [] arguments;
|
||||
for (long i = 0; i < repetitions; i++) {
|
||||
arguments = new string[2];
|
||||
arguments[0] = "testpe.x86";
|
||||
arguments[0] = "testpe";
|
||||
arguments[1] = "!"; // Special flag to not notify debugger.
|
||||
TimeProcess(arguments, runQuiet);
|
||||
}
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
<!--
|
||||
###############################################################################
|
||||
#
|
||||
# Microsoft Research Singularity
|
||||
#
|
||||
# Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
#
|
||||
###############################################################################
|
||||
|
|
|
@ -0,0 +1,297 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Microsoft Research Singularity
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
//
|
||||
// Note: Performance measurer for Singularity Benchmark
|
||||
//
|
||||
|
||||
using System;
|
||||
using Microsoft.Singularity.V1.Services;
|
||||
|
||||
namespace Microsoft.Singularity.Applications
|
||||
{
|
||||
public struct PerfSnap
|
||||
{
|
||||
// Global options for all instances
|
||||
static bool xmlOutput = false;
|
||||
static bool atRing3 = false;
|
||||
|
||||
private bool disabled;
|
||||
private long begCycleCount;
|
||||
private long endCycleCount;
|
||||
private long begSwitchCount;
|
||||
private long endSwitchCount;
|
||||
private long begInterruptCount;
|
||||
private long endInterruptCount;
|
||||
private long begKernelGcCount;
|
||||
private long endKernelGcCount;
|
||||
private long begProcessGcCount;
|
||||
private long endProcessGcCount;
|
||||
private long iterations;
|
||||
private ulong begAllocatedCount;
|
||||
private ulong begAllocatedBytes;
|
||||
private ulong begFreedCount;
|
||||
private ulong begFreedBytes;
|
||||
private ulong endAllocatedCount;
|
||||
private ulong endAllocatedBytes;
|
||||
private ulong endFreedCount;
|
||||
private ulong endFreedBytes;
|
||||
private ulong begStackGets;
|
||||
private ulong begStackRets;
|
||||
private ulong endStackGets;
|
||||
private ulong endStackRets;
|
||||
|
||||
private long begTicks;
|
||||
private long endTicks;
|
||||
|
||||
|
||||
public long Cycles { get { return endCycleCount - begCycleCount; } }
|
||||
public long Interrupts { get { return endInterruptCount - begInterruptCount; } }
|
||||
public long Switches { get { return endSwitchCount - begSwitchCount; } }
|
||||
public long KernelGCs { get { return endKernelGcCount - begKernelGcCount; } }
|
||||
public long ProcessGCs { get { return endProcessGcCount - begProcessGcCount; } }
|
||||
public ulong AllocatedCount { get { return endAllocatedCount-begAllocatedCount; } }
|
||||
public ulong AllocatedBytes { get { return endAllocatedBytes-begAllocatedBytes; } }
|
||||
public ulong FreedCount { get { return endFreedCount - begFreedCount; } }
|
||||
public ulong FreedBytes { get { return endFreedBytes - begFreedBytes; } }
|
||||
public ulong StackGets { get { return endStackGets - begStackGets; } }
|
||||
public ulong StackRets { get { return endStackRets - begStackRets; } }
|
||||
public long ElapsedTicks { get { return endTicks - begTicks; } }
|
||||
|
||||
public void Start()
|
||||
{
|
||||
if (!atRing3) {
|
||||
// disabled = Processor.DisableInterrupts();
|
||||
}
|
||||
|
||||
int collectorCount;
|
||||
long collectorMillis;
|
||||
long collectorBytes;
|
||||
GC.PerformanceCounters(out collectorCount,
|
||||
out collectorMillis,
|
||||
out collectorBytes);
|
||||
|
||||
ulong stackGets;
|
||||
ulong stackRets;
|
||||
StackService.GetUsageStatistics(out stackGets,
|
||||
out stackRets);
|
||||
begStackGets = stackGets;
|
||||
begStackRets = stackRets;
|
||||
|
||||
ulong allocatedCount;
|
||||
ulong allocatedBytes;
|
||||
ulong freedCount;
|
||||
ulong freedBytes;
|
||||
PageTableService.GetUsageStatistics(out allocatedCount,
|
||||
out allocatedBytes,
|
||||
out freedCount,
|
||||
out freedBytes);
|
||||
begAllocatedCount = allocatedCount;
|
||||
begAllocatedBytes = allocatedBytes;
|
||||
begFreedCount = freedCount;
|
||||
begFreedBytes = freedBytes;
|
||||
|
||||
begInterruptCount = ProcessService.GetKernelInterruptCount();
|
||||
begSwitchCount = ProcessService.GetContextSwitchCount();
|
||||
begKernelGcCount = ProcessService.GetKernelGcCount();
|
||||
begProcessGcCount = collectorCount;
|
||||
|
||||
begTicks = DateTime.Now.Ticks;
|
||||
|
||||
|
||||
#if x64_PERF
|
||||
// Set up for perf counting
|
||||
if (!atRing3) {
|
||||
// Reset the performance counters to what we're interested in.
|
||||
Reset(0, PerfEvtSel.COUNT | PerfEvtSel.CyclesNotHalted);
|
||||
Reset(1, PerfEvtSel.COUNT | PerfEvtSel.RetiredInstructions);
|
||||
Reset(2, PerfEvtSel.COUNT | PerfEvtSel.RetiredBranchInstructions);
|
||||
Reset(3, PerfEvtSel.COUNT | PerfEvtSel.RequestsToL2Cache | 0x400);
|
||||
}
|
||||
else {
|
||||
// We're not allowed to reset the perf counters, so take note
|
||||
// of their current values; we will subtract from this later.
|
||||
x64_i0 = Processor.ReadPmc(0);
|
||||
x64_i1 = Processor.ReadPmc(1);
|
||||
x64_i2 = Processor.ReadPmc(2);
|
||||
x64_i3 = Processor.ReadPmc(3);
|
||||
}
|
||||
#endif
|
||||
|
||||
begCycleCount = unchecked((long)Processor.CycleCount);
|
||||
}
|
||||
|
||||
public void Finish(long iterations)
|
||||
{
|
||||
endCycleCount = unchecked((long)Processor.CycleCount);
|
||||
|
||||
#if X64_PERF
|
||||
x64_p0 = Processor.ReadPmc(0);
|
||||
x64_p1 = Processor.ReadPmc(1);
|
||||
x64_p2 = Processor.ReadPmc(2);
|
||||
x64_p3 = Processor.ReadPmc(3);
|
||||
#endif
|
||||
|
||||
endInterruptCount = ProcessService.GetKernelInterruptCount();
|
||||
endSwitchCount = ProcessService.GetContextSwitchCount();
|
||||
endKernelGcCount = ProcessService.GetKernelGcCount();
|
||||
|
||||
int collectorCount;
|
||||
long collectorMillis;
|
||||
long collectorBytes;
|
||||
GC.PerformanceCounters(out collectorCount,
|
||||
out collectorMillis,
|
||||
out collectorBytes);
|
||||
endProcessGcCount = collectorCount;
|
||||
|
||||
ulong allocatedCount;
|
||||
ulong allocatedBytes;
|
||||
ulong freedCount;
|
||||
ulong freedBytes;
|
||||
PageTableService.GetUsageStatistics(out allocatedCount,
|
||||
out allocatedBytes,
|
||||
out freedCount,
|
||||
out freedBytes);
|
||||
endAllocatedCount = allocatedCount;
|
||||
endAllocatedBytes = allocatedBytes;
|
||||
endFreedCount = freedCount;
|
||||
endFreedBytes = freedBytes;
|
||||
|
||||
ulong stackGets;
|
||||
ulong stackRets;
|
||||
StackService.GetUsageStatistics(out stackGets,
|
||||
out stackRets);
|
||||
endStackGets = stackGets;
|
||||
endStackRets = stackRets;
|
||||
|
||||
endTicks = DateTime.Now.Ticks;
|
||||
|
||||
if (!atRing3) {
|
||||
// /ravi/07/14/07/ Processor.RestoreInterrupts(disabled);
|
||||
}
|
||||
|
||||
this.iterations = iterations;
|
||||
}
|
||||
|
||||
public void Display(string name)
|
||||
{
|
||||
if (xmlOutput) {
|
||||
DisplayXml(name);
|
||||
}
|
||||
else {
|
||||
DisplayText(name);
|
||||
}
|
||||
}
|
||||
|
||||
private static void WriteXmlValue(string name, long value)
|
||||
{
|
||||
DualWriteLine(
|
||||
String.Format(" <Measurement> <name> {0} </name> <value> {1:d} </value> </Measurement>", name, value)
|
||||
);
|
||||
}
|
||||
|
||||
private static void WriteXmlValue(string name, ulong value)
|
||||
{
|
||||
DualWriteLine(
|
||||
String.Format(" <Measurement> <name> {0} </name> <value> {1:d} </value> </Measurement>", name, value)
|
||||
);
|
||||
}
|
||||
|
||||
private void DisplayXml(string name)
|
||||
{
|
||||
DualWriteLine(
|
||||
String.Format("<Microbenchmark Name=\"{0}\">", name)
|
||||
);
|
||||
WriteXmlValue("CyclesPerIteration", Cycles / iterations);
|
||||
WriteXmlValue("Cycles", Cycles);
|
||||
WriteXmlValue("Iterations", iterations);
|
||||
WriteXmlValue("Switches", Switches);
|
||||
WriteXmlValue("Interrupts", Interrupts);
|
||||
WriteXmlValue("KernelGCs", KernelGCs);
|
||||
WriteXmlValue("ProcessGCs", ProcessGCs);
|
||||
WriteXmlValue("AllocationCount", AllocatedCount);
|
||||
WriteXmlValue("AllocationBytes", AllocatedBytes);
|
||||
WriteXmlValue("FreedCount", FreedCount);
|
||||
WriteXmlValue("FreedBytes", FreedBytes);
|
||||
WriteXmlValue("StackGetCount", StackGets);
|
||||
WriteXmlValue("StackReturnCount", StackRets);
|
||||
WriteXmlValue("ElapsedTicks", ElapsedTicks);
|
||||
DualWriteLine("</Microbenchmark>");
|
||||
}
|
||||
|
||||
private void DisplayText(string name)
|
||||
{
|
||||
DualWriteLine(
|
||||
String.Format("{0,-16} {1,6:d} x{2,8:d} {3,6:d} " +
|
||||
"[swi={4,6:d} int={5,3:d} gc={6:d}/{7:d}]",
|
||||
name,
|
||||
iterations,
|
||||
Cycles / iterations,
|
||||
ElapsedTicks / iterations,
|
||||
Switches,
|
||||
Interrupts,
|
||||
KernelGCs,
|
||||
ProcessGCs)
|
||||
);
|
||||
|
||||
if (AllocatedCount > 1 || FreedCount > 1 || StackGets > 1) {
|
||||
DualWriteLine(
|
||||
string.Format(
|
||||
" " +
|
||||
"[alloc={0,4:d}/{1,8:x} free={2,4:d}/{3,8:x} " +
|
||||
"stack={4,4:d}/{5,4:d}]",
|
||||
AllocatedCount,
|
||||
AllocatedBytes,
|
||||
FreedCount,
|
||||
FreedBytes,
|
||||
StackGets,
|
||||
StackRets)
|
||||
);
|
||||
}
|
||||
|
||||
#if x64_PERF
|
||||
if (!atRing3) {
|
||||
// Read off the current MSR values and turn them
|
||||
// into nice labels
|
||||
ulong e0 = Processor.ReadMsr(0xc0010000);
|
||||
ulong e1 = Processor.ReadMsr(0xc0010001);
|
||||
ulong e2 = Processor.ReadMsr(0xc0010002);
|
||||
ulong e3 = Processor.ReadMsr(0xc0010003);
|
||||
|
||||
DualWriteLine(
|
||||
String.Format("evt: {0,16} {1,16} {2,16} {3,16}",
|
||||
EvtSelToString(e0),
|
||||
EvtSelToString(e1),
|
||||
EvtSelToString(e2),
|
||||
EvtSelToString(e3)));
|
||||
}
|
||||
else {
|
||||
// Subtract from the initial perf-counter values to
|
||||
// get the delta we want
|
||||
x64_p0 -= x64_i0;
|
||||
x64_p1 -= x64_i1;
|
||||
x64_p2 -= x64_i2;
|
||||
x64_p3 -= x64_i3;
|
||||
}
|
||||
|
||||
DualWriteLine(
|
||||
String.Format("pmc: {0:d16} {1:d16} {2:d16} {3:d16} {4:d16}\n\n",
|
||||
Cycles, x64_p0, x64_p1, x64_p2, x64_p3));
|
||||
#endif
|
||||
}
|
||||
|
||||
private static void DualWriteLine(string message)
|
||||
{
|
||||
Console.WriteLine(message);
|
||||
DebugStub.WriteLine(message);
|
||||
}
|
||||
|
||||
public static void SetOptions(bool ring3, bool doXmlOutput)
|
||||
{
|
||||
PerfSnap.atRing3 = ring3;
|
||||
PerfSnap.xmlOutput = doXmlOutput;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
<!--
|
||||
###############################################################################
|
||||
#
|
||||
# Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
#
|
||||
###############################################################################
|
||||
-->
|
||||
|
||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="..\..\..\Paths.targets" />
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<AssemblyName>schedbench</AssemblyName>
|
||||
<AssumeFieldsNonNull>true</AssumeFieldsNonNull>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Include="PerfSnap.sg" />
|
||||
<Compile Include="SchedBench.sg" />
|
||||
<ProjectReference Include="$(SINGULARITY_ROOT)\Contracts\Diagnostics.Contracts\Diagnostics.Contracts.csproj" />
|
||||
<ProjectReference Include="$(SINGULARITY_ROOT)\Libraries\DirectoryService.Utils\DirectoryService.Utils.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<Import Project="$(SINGULARITY_ROOT)\Targets\ConsoleCategory.targets" />
|
||||
|
||||
</Project>
|
File diff suppressed because it is too large
Load Diff
|
@ -4,8 +4,6 @@
|
|||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
//
|
||||
// File: SharedHeapBench.cs
|
||||
//
|
||||
// Note: Singularity micro-benchmark program.
|
||||
//
|
||||
using Microsoft.Singularity;
|
||||
|
@ -24,7 +22,8 @@ using Microsoft.Singularity.Io;
|
|||
using Microsoft.Singularity.Configuration;
|
||||
[assembly: Transform(typeof(ApplicationResourceTransform))]
|
||||
|
||||
namespace Microsoft.Singularity.Applications {
|
||||
namespace Microsoft.Singularity.Applications
|
||||
{
|
||||
[ConsoleCategory(HelpMessage="Show attributes associated with a file", DefaultAction=true)]
|
||||
internal class Parameters {
|
||||
[InputEndpoint("data")]
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
<!--
|
||||
###############################################################################
|
||||
#
|
||||
# Microsoft Research Singularity
|
||||
#
|
||||
# Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
#
|
||||
###############################################################################
|
||||
|
|
|
@ -4,8 +4,6 @@
|
|||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
//
|
||||
// File: BenchChild.sg
|
||||
//
|
||||
// Note: Simple ping-pong second child process
|
||||
//
|
||||
|
||||
|
@ -52,12 +50,13 @@ namespace Microsoft.Singularity.Applications.Singbench
|
|||
if (config.doWhere) {
|
||||
if (Processor.AtKernelPrivilege()) {
|
||||
DualWriteLine("Benchchild running at KERNEL privilege");
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
DualWriteLine("Benchchild running at USER privilege");
|
||||
}
|
||||
}
|
||||
|
||||
ExtensionContract.Exp ep = (config.sendRef).Acquire();
|
||||
ExtensionContract.Exp ep = ((!)config.sendRef).Acquire();
|
||||
|
||||
|
||||
SendTestContract.Exp simpleConn = ep as SendTestContract.Exp;
|
||||
|
@ -82,7 +81,7 @@ namespace Microsoft.Singularity.Applications.Singbench
|
|||
conn.SendTestReady();
|
||||
int arg;
|
||||
|
||||
while(true) {
|
||||
while (true) {
|
||||
conn.RecvReq(out arg);
|
||||
|
||||
if (arg == -1) {
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
<!--
|
||||
###############################################################################
|
||||
#
|
||||
# Microsoft Research Singularity
|
||||
#
|
||||
# Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
#
|
||||
###############################################################################
|
||||
|
@ -14,16 +12,15 @@
|
|||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<AssemblyName>benchchild</AssemblyName>
|
||||
<AssumeFieldsNonNull>true</AssumeFieldsNonNull>
|
||||
</PropertyGroup>
|
||||
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Include="BenchChild.sg" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Contracts\SingBench.Contracts.csproj" />
|
||||
</ItemGroup>
|
||||
</ItemGroup>
|
||||
|
||||
<Import Project="$(SINGULARITY_ROOT)\Targets\ConsoleCategory.targets" />
|
||||
|
||||
|
|
|
@ -4,7 +4,6 @@
|
|||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
//
|
||||
// File: MemoryContract.sg
|
||||
// Note: Contract definition for the memory diagnostic module
|
||||
//
|
||||
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
<!--
|
||||
###############################################################################
|
||||
#
|
||||
# Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
#
|
||||
###############################################################################
|
||||
-->
|
||||
|
||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="..\..\..\..\Paths.targets" />
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Library</OutputType>
|
||||
<AssemblyName>Singbench.Contracts</AssemblyName>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Include="ChannelTestContract.sg" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="$(SINGULARITY_ROOT)\Contracts\Directory.Contracts\Directory.Contracts.Kernel.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<Import Project="$(SINGULARITY_ROOT)\Targets\KernelLibrary.targets" />
|
||||
|
||||
</Project>
|
|
@ -1,8 +1,6 @@
|
|||
<!--
|
||||
###############################################################################
|
||||
#
|
||||
# Microsoft Research Singularity
|
||||
#
|
||||
# Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
#
|
||||
###############################################################################
|
||||
|
@ -13,7 +11,7 @@
|
|||
|
||||
<PropertyGroup>
|
||||
<OutputType>Library</OutputType>
|
||||
<AssemblyName>SingBench.Contracts</AssemblyName>
|
||||
<AssemblyName>Singbench.Contracts</AssemblyName>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
@ -1,3 +1,11 @@
|
|||
<!--
|
||||
###############################################################################
|
||||
#
|
||||
# Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
#
|
||||
###############################################################################
|
||||
-->
|
||||
|
||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
|
||||
<Import Project="..\..\..\Paths.targets"/>
|
||||
|
|
|
@ -0,0 +1,127 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Microsoft Research Singularity
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
//
|
||||
using Microsoft.Singularity.Channels;
|
||||
using Microsoft.Singularity.Diagnostics.Contracts;
|
||||
using Microsoft.Singularity.Endpoint;
|
||||
using Microsoft.Singularity.Directory;
|
||||
using Microsoft.Singularity.V1.Services;
|
||||
using Microsoft.Singularity.Io;
|
||||
using Microsoft.Singularity.Configuration;
|
||||
|
||||
using System;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Threading;
|
||||
|
||||
using Microsoft.Contracts;
|
||||
using Microsoft.SingSharp.Reflection;
|
||||
using Microsoft.Singularity.Applications;
|
||||
|
||||
using Allocation = Microsoft.Singularity.V1.Services.SharedHeapService.Allocation;
|
||||
|
||||
namespace Microsoft.Singularity.Applications.Singbench
|
||||
{
|
||||
public sealed class Child
|
||||
{
|
||||
public static void ReceivePerf(int iterations)
|
||||
{
|
||||
int doit = iterations / 2;
|
||||
|
||||
// Make a new channel.
|
||||
SendTestContract.Imp! childImp;
|
||||
SendTestContract.Exp! childExp;
|
||||
SendTestContract.NewChannel(out childImp, out childExp);
|
||||
|
||||
// Start up our child
|
||||
string[] args = new string[3];
|
||||
args[0] = "BenchChild";
|
||||
args[1] = "-where";
|
||||
args[2] = "!";
|
||||
Process child = new Process(args, (Endpoint * in ExHeap)childExp);
|
||||
|
||||
// set the where parameter to true
|
||||
ParameterCode code;
|
||||
code = child.SetStartupBoolArg(0, true);
|
||||
if (code != ParameterCode.Success) {
|
||||
Console.WriteLine("unable to set bool index 0. error={0}", code);
|
||||
delete childImp;
|
||||
return;
|
||||
}
|
||||
|
||||
child.Start();
|
||||
|
||||
childImp.RecvTestReady();
|
||||
|
||||
PerfSnap snap = new PerfSnap();
|
||||
|
||||
snap.Start();
|
||||
try {
|
||||
int arg;
|
||||
for (int i = 0; i < doit; i++) {
|
||||
arg = i;
|
||||
childImp.SendReq(arg);
|
||||
childImp.RecvResp(out arg);
|
||||
}
|
||||
}
|
||||
finally {
|
||||
snap.Finish(iterations);
|
||||
}
|
||||
|
||||
childImp.SendReq(-1);
|
||||
delete childImp;
|
||||
child.Join();
|
||||
|
||||
snap.Display("CHILD S/R");
|
||||
}
|
||||
|
||||
////////////////////////////// Child send-receive performance test
|
||||
//
|
||||
public static void ReceivePerf2(int iterations, int messageBytes)
|
||||
{
|
||||
// Make a new channel.
|
||||
BufferTestContract.Imp! childImp;
|
||||
BufferTestContract.Exp! childExp;
|
||||
BufferTestContract.NewChannel(out childImp, out childExp);
|
||||
|
||||
// Start up our child
|
||||
string[] args = new string[2];
|
||||
args[0] = "BenchChild";
|
||||
args[1] = "!";
|
||||
Process child = new Process(args, (Endpoint * in ExHeap)childExp);
|
||||
child.Start();
|
||||
|
||||
childImp.RecvBufferReady();
|
||||
|
||||
byte[]! in ExHeap buffer = new [ExHeap] byte[messageBytes];
|
||||
|
||||
PerfSnap snap = new PerfSnap();
|
||||
|
||||
snap.Start();
|
||||
try {
|
||||
for (int i = 0; i < iterations; i++) {
|
||||
childImp.SendReq(iterations - i - 1, buffer);
|
||||
childImp.RecvResp(out buffer);
|
||||
}
|
||||
}
|
||||
finally {
|
||||
// Factor of two for one-sided send-receive only
|
||||
snap.Finish(2 * iterations);
|
||||
delete buffer;
|
||||
}
|
||||
|
||||
delete childImp;
|
||||
child.Join();
|
||||
|
||||
if (messageBytes < 1024) {
|
||||
snap.Display(String.Format("Child S/RB-{0}", messageBytes));
|
||||
}
|
||||
else {
|
||||
snap.Display(String.Format("Child S/RB-{0}K",
|
||||
messageBytes / 1024));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,62 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Microsoft Research Singularity
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
//
|
||||
|
||||
using Microsoft.Singularity.Channels;
|
||||
using Microsoft.Singularity.Diagnostics.Contracts;
|
||||
using Microsoft.Singularity.Endpoint;
|
||||
using Microsoft.Singularity.Directory;
|
||||
using Microsoft.Singularity.V1.Services;
|
||||
using Microsoft.Singularity.Io;
|
||||
using Microsoft.Singularity.Configuration;
|
||||
|
||||
using System;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Threading;
|
||||
|
||||
using Microsoft.Contracts;
|
||||
using Microsoft.SingSharp.Reflection;
|
||||
using Microsoft.Singularity.Applications;
|
||||
|
||||
using Allocation = Microsoft.Singularity.V1.Services.SharedHeapService.Allocation;
|
||||
|
||||
[assembly: Transform(typeof(ApplicationResourceTransform))]
|
||||
namespace Microsoft.Singularity.Applications.Singbench
|
||||
{
|
||||
[ConsoleCategory(HelpMessage="Singularity Benchmark Application", DefaultAction=true)]
|
||||
internal sealed class Parameters
|
||||
{
|
||||
[InputEndpoint("data")]
|
||||
public readonly TRef<UnicodePipeContract.Exp:READY> Stdin;
|
||||
|
||||
[OutputEndpoint("data")]
|
||||
public readonly TRef<UnicodePipeContract.Imp:READY> Stdout;
|
||||
|
||||
[Endpoint]
|
||||
public readonly TRef<MemoryContract.Imp:Start> memoryRef;
|
||||
|
||||
[BoolParameter( "b", Default=false , HelpMessage="Break at start of tests.")]
|
||||
internal bool breakIn;
|
||||
|
||||
[LongParameter( "i", Default=10000 , HelpMessage="Iterate tests <n> times.")]
|
||||
internal long iterations;
|
||||
|
||||
[BoolParameter( "n", Default=true , HelpMessage="No GC between tests.")]
|
||||
internal bool allowGC;
|
||||
|
||||
[BoolParameter( "w", Default=false , HelpMessage="Wait for key press between tests.")]
|
||||
internal bool pauseForKeys;
|
||||
|
||||
[BoolParameter( "x", Default=false , HelpMessage="XML output.")]
|
||||
internal bool xmlOutput;
|
||||
|
||||
reflective internal Parameters();
|
||||
|
||||
internal int AppMain() {
|
||||
return SingBench.AppMain(this);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -4,8 +4,6 @@
|
|||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
//
|
||||
// File: PerfSnap.sg
|
||||
//
|
||||
// Note: Performance measurer for Singularity Benchmark
|
||||
//
|
||||
|
||||
|
@ -62,7 +60,7 @@ namespace Microsoft.Singularity.Applications.Singbench
|
|||
public void Start()
|
||||
{
|
||||
if (!atRing3) {
|
||||
disabled = Processor.DisableInterrupts();
|
||||
// disabled = Processor.DisableInterrupts();
|
||||
// flush out pending IO interrupts
|
||||
Thread.Yield();
|
||||
Thread.Yield();
|
||||
|
@ -111,7 +109,8 @@ namespace Microsoft.Singularity.Applications.Singbench
|
|||
Reset(1, PerfEvtSel.COUNT | PerfEvtSel.RetiredInstructions);
|
||||
Reset(2, PerfEvtSel.COUNT | PerfEvtSel.RetiredBranchInstructions);
|
||||
Reset(3, PerfEvtSel.COUNT | PerfEvtSel.RequestsToL2Cache | 0x400);
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
// We're not allowed to reset the perf counters, so take note
|
||||
// of their current values; we will subtract from this later.
|
||||
x64_i0 = Processor.ReadPmc(0);
|
||||
|
@ -168,7 +167,7 @@ namespace Microsoft.Singularity.Applications.Singbench
|
|||
endStackRets = stackRets;
|
||||
|
||||
if (!atRing3) {
|
||||
Processor.RestoreInterrupts(disabled);
|
||||
// Processor.RestoreInterrupts(disabled);
|
||||
}
|
||||
|
||||
this.iterations = iterations;
|
||||
|
@ -178,7 +177,8 @@ namespace Microsoft.Singularity.Applications.Singbench
|
|||
{
|
||||
if (xmlOutput) {
|
||||
DisplayXml(name);
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
DisplayText(name);
|
||||
}
|
||||
}
|
||||
|
@ -263,7 +263,8 @@ namespace Microsoft.Singularity.Applications.Singbench
|
|||
EvtSelToString(e1),
|
||||
EvtSelToString(e2),
|
||||
EvtSelToString(e3)));
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
// Subtract from the initial perf-counter values to
|
||||
// get the delta we want
|
||||
x64_p0 -= x64_i0;
|
||||
|
|
|
@ -4,10 +4,7 @@
|
|||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
//
|
||||
// File: SingBench.sg
|
||||
//
|
||||
// Note: Benchmark suite for Singularity primitives
|
||||
//
|
||||
|
||||
using Microsoft.Singularity.Channels;
|
||||
using Microsoft.Singularity.Diagnostics.Contracts;
|
||||
using Microsoft.Singularity.Endpoint;
|
||||
|
@ -23,44 +20,11 @@ using System.Threading;
|
|||
using Microsoft.Contracts;
|
||||
using Microsoft.SingSharp.Reflection;
|
||||
using Microsoft.Singularity.Applications;
|
||||
[assembly: Transform(typeof(ApplicationResourceTransform))]
|
||||
|
||||
using Allocation = Microsoft.Singularity.V1.Services.SharedHeapService.Allocation;
|
||||
|
||||
namespace Microsoft.Singularity.Applications.Singbench
|
||||
{
|
||||
[ConsoleCategory(HelpMessage="Singularity Benchmark Application", DefaultAction=true)]
|
||||
internal sealed class Parameters
|
||||
{
|
||||
[InputEndpoint("data")]
|
||||
public readonly TRef<UnicodePipeContract.Exp:READY> Stdin;
|
||||
|
||||
[OutputEndpoint("data")]
|
||||
public readonly TRef<UnicodePipeContract.Imp:READY> Stdout;
|
||||
|
||||
[Endpoint]
|
||||
public readonly TRef<MemoryContract.Imp:Start> memoryRef;
|
||||
|
||||
[BoolParameter( "b", Default=false , HelpMessage="Break at start of tests.")]
|
||||
internal bool breakIn;
|
||||
|
||||
[BoolParameter( "n", Default=true , HelpMessage="No GC between tests.")]
|
||||
internal bool allowGC;
|
||||
|
||||
[BoolParameter( "w", Default=false , HelpMessage="Wait for key press between tests.")]
|
||||
internal bool pauseForKeys;
|
||||
|
||||
[BoolParameter( "x", Default=false , HelpMessage="XML output.")]
|
||||
internal bool xmlOutput;
|
||||
|
||||
[LongParameter( "i", Default=10000 , HelpMessage="Iterate tests <n> times.")]
|
||||
internal long iterations;
|
||||
|
||||
reflective internal Parameters();
|
||||
|
||||
internal int AppMain() {
|
||||
return SingBench.AppMain(this);
|
||||
}
|
||||
}
|
||||
|
||||
public class SingBench
|
||||
{
|
||||
private static bool atRing3;
|
||||
|
@ -244,19 +208,22 @@ namespace Microsoft.Singularity.Applications.Singbench
|
|||
|
||||
PerfSnap snap = new PerfSnap();
|
||||
|
||||
bool saved = Processor.DisableInterrupts();
|
||||
System.Diagnostics.Debug.Assert(saved == true);
|
||||
bool saved = Processor.DisableLocalPreemption();
|
||||
// We no longer disable interrupts for this test.
|
||||
// When the scheduler implements the SIP scheduling,
|
||||
// we can enable this back after switching to the local preemption
|
||||
//System.Diagnostics.Debug.Assert(saved == true);
|
||||
|
||||
try {
|
||||
snap.Start();
|
||||
for (int i = 0; i < iterations; i++) {
|
||||
Processor.RestoreInterrupts(saved);
|
||||
saved = Processor.DisableInterrupts();
|
||||
Processor.RestoreLocalPreemption(saved);
|
||||
saved = Processor.DisableLocalPreemption();
|
||||
}
|
||||
}
|
||||
finally {
|
||||
snap.Finish(iterations);
|
||||
Processor.RestoreInterrupts(saved);
|
||||
Processor.RestoreLocalPreemption(saved);
|
||||
}
|
||||
|
||||
snap.Display("Irq SVE/RSTR");
|
||||
|
@ -431,6 +398,8 @@ namespace Microsoft.Singularity.Applications.Singbench
|
|||
snap.Display("Wait/Set");
|
||||
}
|
||||
|
||||
//==============START SEND/RECV TESTS==================================
|
||||
|
||||
/////////////////////////////////////////// Receive Performance Tests.
|
||||
//
|
||||
public contract ReceivePerfTest
|
||||
|
@ -482,7 +451,7 @@ namespace Microsoft.Singularity.Applications.Singbench
|
|||
|
||||
snap.Start();
|
||||
|
||||
if (breakIn) {
|
||||
if (breakIn) {
|
||||
DebugStub.Break();
|
||||
}
|
||||
|
||||
|
@ -557,7 +526,7 @@ namespace Microsoft.Singularity.Applications.Singbench
|
|||
|
||||
snap.Start();
|
||||
|
||||
if (breakIn) {
|
||||
if (breakIn) {
|
||||
DebugStub.Break();
|
||||
}
|
||||
|
||||
|
@ -585,106 +554,6 @@ namespace Microsoft.Singularity.Applications.Singbench
|
|||
}
|
||||
}
|
||||
|
||||
/////////////////////////////////////////// Child-Receive performance tests
|
||||
//
|
||||
public static void DoChildReceivePerf(int iterations)
|
||||
{
|
||||
int doit = iterations / 2;
|
||||
|
||||
// Make a new channel.
|
||||
SendTestContract.Imp! childImp;
|
||||
SendTestContract.Exp! childExp;
|
||||
SendTestContract.NewChannel(out childImp, out childExp);
|
||||
|
||||
// Start up our child
|
||||
string[] args = new string[3];
|
||||
args[0] = "BenchChild.x86";
|
||||
args[1] = "-where";
|
||||
args[2] = "!";
|
||||
Process child = new Process(args, (Endpoint * in ExHeap)childExp);
|
||||
|
||||
// set the where parameter to true
|
||||
ParameterCode code;
|
||||
code = child.SetStartupBoolArg(0, true);
|
||||
if (code != ParameterCode.Success){
|
||||
Console.WriteLine("unable to set bool index 0. error={0}", code);
|
||||
delete childImp;
|
||||
return;
|
||||
}
|
||||
|
||||
child.Start();
|
||||
|
||||
childImp.RecvTestReady();
|
||||
|
||||
PerfSnap snap = new PerfSnap();
|
||||
|
||||
snap.Start();
|
||||
try {
|
||||
int arg;
|
||||
for (int i = 0; i < doit; i++) {
|
||||
arg = i;
|
||||
childImp.SendReq(arg);
|
||||
childImp.RecvResp(out arg);
|
||||
}
|
||||
}
|
||||
finally {
|
||||
snap.Finish(iterations);
|
||||
}
|
||||
|
||||
childImp.SendReq(-1);
|
||||
delete childImp;
|
||||
child.Join();
|
||||
|
||||
snap.Display("CHILD S/R");
|
||||
}
|
||||
|
||||
////////////////////////////// Child send-receive performance test
|
||||
//
|
||||
public static void DoChildReceivePerf2(int iterations, int messageBytes)
|
||||
{
|
||||
// Make a new channel.
|
||||
BufferTestContract.Imp! childImp;
|
||||
BufferTestContract.Exp! childExp;
|
||||
BufferTestContract.NewChannel(out childImp, out childExp);
|
||||
|
||||
// Start up our child
|
||||
string[] args = new string[2];
|
||||
args[0] = "BenchChild.x86";
|
||||
args[1] = "!";
|
||||
Process child = new Process(args, (Endpoint * in ExHeap)childExp);
|
||||
child.Start();
|
||||
|
||||
childImp.RecvBufferReady();
|
||||
|
||||
byte[]! in ExHeap buffer = new [ExHeap] byte[messageBytes];
|
||||
|
||||
PerfSnap snap = new PerfSnap();
|
||||
|
||||
snap.Start();
|
||||
try {
|
||||
for (int i = 0; i < iterations; i++) {
|
||||
childImp.SendReq(iterations - i - 1, buffer);
|
||||
childImp.RecvResp(out buffer);
|
||||
}
|
||||
}
|
||||
finally {
|
||||
// Factor of two for one-sided send-receive only
|
||||
snap.Finish(2 * iterations);
|
||||
delete buffer;
|
||||
}
|
||||
|
||||
delete childImp;
|
||||
child.Join();
|
||||
|
||||
if (messageBytes < 1024) {
|
||||
snap.Display(String.Format("Child S/RB-{0}", messageBytes));
|
||||
}
|
||||
else {
|
||||
snap.Display(String.Format("Child S/RB-{0}K",
|
||||
messageBytes / 1024));
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////// Switch Performance Tests.
|
||||
//
|
||||
public contract SwitchPerfTest
|
||||
|
@ -706,8 +575,7 @@ namespace Microsoft.Singularity.Applications.Singbench
|
|||
peerReady.Set();
|
||||
|
||||
for (int i = 0; i != -1;) {
|
||||
switch receive
|
||||
{
|
||||
switch receive {
|
||||
case ep.Req(arg) in s:
|
||||
i = arg;
|
||||
if (i != -1) {
|
||||
|
@ -754,11 +622,10 @@ namespace Microsoft.Singularity.Applications.Singbench
|
|||
e.SendReq(0);
|
||||
s.Add(e);
|
||||
for (int i = 0; i < doit; i++) {
|
||||
switch receive
|
||||
{
|
||||
switch receive {
|
||||
case ep.Resp(arg) in s:
|
||||
i = arg;
|
||||
if (i == doit -1) {
|
||||
if (i == doit - 1) {
|
||||
ep.SendReq(-1);
|
||||
}
|
||||
else {
|
||||
|
@ -782,6 +649,8 @@ namespace Microsoft.Singularity.Applications.Singbench
|
|||
snap.Display("Send/Switch");
|
||||
}
|
||||
|
||||
//==============END SEND/RECV TESTS==================================
|
||||
|
||||
//////////////////////////////////////////// Create Directory Channel.
|
||||
//
|
||||
public static void DoPageAllocPerf(int iterations)
|
||||
|
@ -927,7 +796,7 @@ namespace Microsoft.Singularity.Applications.Singbench
|
|||
public static void SelectThread()
|
||||
{
|
||||
for (int i = 0; i < SELECT_ITERATIONS; i++) {
|
||||
for (int j = 0; j < NSELECT; j+=3) {
|
||||
for (int j = 0; j < NSELECT; j += 3) {
|
||||
SelectTest.Imp imp = ((!)impEndpoints[j]).Acquire();
|
||||
|
||||
imp.SendA();
|
||||
|
@ -935,7 +804,7 @@ namespace Microsoft.Singularity.Applications.Singbench
|
|||
((!)impEndpoints[j]).Release(imp);
|
||||
}
|
||||
|
||||
for (int j = 1; j < NSELECT; j+=3) {
|
||||
for (int j = 1; j < NSELECT; j += 3) {
|
||||
SelectTest.Imp imp = ((!)impEndpoints[j]).Acquire();
|
||||
|
||||
imp.SendB();
|
||||
|
@ -943,7 +812,7 @@ namespace Microsoft.Singularity.Applications.Singbench
|
|||
((!)impEndpoints[j]).Release(imp);
|
||||
}
|
||||
|
||||
for (int j = 2; j < NSELECT; j+=3) {
|
||||
for (int j = 2; j < NSELECT; j += 3) {
|
||||
SelectTest.Imp imp = ((!)impEndpoints[j]).Acquire();
|
||||
|
||||
imp.SendC();
|
||||
|
@ -1020,7 +889,7 @@ namespace Microsoft.Singularity.Applications.Singbench
|
|||
|
||||
bool failed = false;
|
||||
for (int i = 0; i < SELECT_ITERATIONS; i++) {
|
||||
for(int j = 0; j < NSELECT-2; j++) {
|
||||
for (int j = 0; j < NSELECT - 2; j++) {
|
||||
SelectTest.Exp a = ((!)expEndpoints[j+0]).Acquire();
|
||||
SelectTest.Exp b = ((!)expEndpoints[j+1]).Acquire();
|
||||
SelectTest.Exp c = ((!)expEndpoints[j+2]).Acquire();
|
||||
|
@ -1110,7 +979,7 @@ namespace Microsoft.Singularity.Applications.Singbench
|
|||
bool failed = false;
|
||||
|
||||
Console.WriteLine(" Starting server loop - {0} iterations", SELECT_ITERATIONS);
|
||||
for (i = 0 ; i < SELECT_ITERATIONS; i++) {
|
||||
for (i = 0; i < SELECT_ITERATIONS; i++) {
|
||||
ActuallySelect(eset, 0, ref failed);
|
||||
ActuallySelect(eset, 0, ref failed);
|
||||
ActuallySelect(eset, 0, ref failed);
|
||||
|
@ -1177,7 +1046,7 @@ namespace Microsoft.Singularity.Applications.Singbench
|
|||
Process[] process = new Process[iterations];
|
||||
|
||||
string[] args = new string[2];
|
||||
args[0] = "testpe.x86";
|
||||
args[0] = "testpe";
|
||||
args[1] = "!"; // Special flag to not notify debugger.
|
||||
|
||||
PerfSnap snap = new PerfSnap();
|
||||
|
@ -1232,6 +1101,8 @@ namespace Microsoft.Singularity.Applications.Singbench
|
|||
//
|
||||
public static int GetTrace()
|
||||
{
|
||||
|
||||
#if false
|
||||
Tracing.LogEntry * lstart;
|
||||
Tracing.LogEntry * llimit;
|
||||
Tracing.LogEntry ** lhead;
|
||||
|
@ -1245,6 +1116,7 @@ namespace Microsoft.Singularity.Applications.Singbench
|
|||
(UIntPtr)lstart, (UIntPtr)llimit, (UIntPtr)lhead, (UIntPtr)(*lhead));
|
||||
Console.WriteLine("Text: {0:X} {1:X}, {2:X}, {3:X}",
|
||||
(UIntPtr)tstart, (UIntPtr)tlimit, (UIntPtr)thead, (UIntPtr)(*thead));
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1279,12 +1151,13 @@ namespace Microsoft.Singularity.Applications.Singbench
|
|||
bool xmlOutput = config.xmlOutput;
|
||||
allowGC = config.allowGC;
|
||||
pauseForKeys = config.pauseForKeys;
|
||||
breakIn = config.breakIn;
|
||||
|
||||
breakIn = config.breakIn;
|
||||
|
||||
if (Processor.AtKernelPrivilege()) {
|
||||
atRing3 = false;
|
||||
DualWriteLine("Singbench running at KERNEL privilege");
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
atRing3 = true;
|
||||
DualWriteLine("Singbench running at USER privilege");
|
||||
}
|
||||
|
@ -1293,14 +1166,14 @@ namespace Microsoft.Singularity.Applications.Singbench
|
|||
peerBegin = new AutoResetEvent(false);
|
||||
peerFinish = new AutoResetEvent(false);
|
||||
|
||||
MemoryContract.Imp impMem = config.memoryRef.Acquire();
|
||||
MemoryContract.Imp impMem = config.memoryRef.Acquire();
|
||||
if (impMem == null) {
|
||||
throw new ApplicationException("Error: Unable to bind to " +
|
||||
MemoryContract.ModuleName);
|
||||
}
|
||||
|
||||
impMem.RecvReady();
|
||||
|
||||
impMem.RecvReady();
|
||||
|
||||
PerfSnap.SetOptions(atRing3, xmlOutput);
|
||||
|
||||
GetTrace();
|
||||
|
@ -1345,25 +1218,24 @@ namespace Microsoft.Singularity.Applications.Singbench
|
|||
Pause();
|
||||
|
||||
ClearEnvironment(impMem);
|
||||
DoReceivePerf(1000);
|
||||
DoReceivePerf(1024);
|
||||
Pause();
|
||||
|
||||
for (int i = 1; i <= 65536; i *= 2) {
|
||||
ClearEnvironment(impMem);
|
||||
DoReceivePerf2(iterations, i);
|
||||
Pause();
|
||||
Pause();
|
||||
}
|
||||
|
||||
// Child-channel tests
|
||||
ClearEnvironment(impMem);
|
||||
DoChildReceivePerf(1000);
|
||||
Child.ReceivePerf(1000);
|
||||
Pause();
|
||||
|
||||
|
||||
for (int i = 1; i <= 65536; i *= 2) {
|
||||
ClearEnvironment(impMem);
|
||||
DoChildReceivePerf2(iterations, i);
|
||||
Pause();
|
||||
Child.ReceivePerf2(iterations, i);
|
||||
Pause();
|
||||
}
|
||||
|
||||
ClearEnvironment(impMem);
|
||||
|
@ -1419,8 +1291,8 @@ namespace Microsoft.Singularity.Applications.Singbench
|
|||
ClearEnvironment(impMem);
|
||||
DoSelectSet();
|
||||
#endif
|
||||
|
||||
} catch (Exception e) {
|
||||
}
|
||||
catch (Exception e) {
|
||||
Console.WriteLine("Caught {0}", e.Message);
|
||||
// How do I work out where an exception was thrown from these days?
|
||||
//Console.WriteLine(e.StackTrace);
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
<!--
|
||||
###############################################################################
|
||||
#
|
||||
# Microsoft Research Singularity
|
||||
#
|
||||
# Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
#
|
||||
###############################################################################
|
||||
|
@ -15,9 +13,12 @@
|
|||
<OutputType>Exe</OutputType>
|
||||
<AssemblyName>singbench</AssemblyName>
|
||||
<AssumeFieldsNonNull>true</AssumeFieldsNonNull>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
</PropertyGroup>
|
||||
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Include="Child.sg" />
|
||||
<Compile Include="Parameters.sg" />
|
||||
<Compile Include="PerfSnap.sg" />
|
||||
<Compile Include="SingBench.sg" />
|
||||
<ProjectReference Include="$(SINGULARITY_ROOT)\Contracts\Diagnostics.Contracts\Diagnostics.Contracts.csproj" />
|
||||
|
|
|
@ -1,8 +1,3 @@
|
|||
From: Mark Aiken
|
||||
Sent: Sunday, October 16, 2005 4:19 PM
|
||||
To: Chris Hawblitzel
|
||||
Subject: Running SPECweb
|
||||
|
||||
Here is how to run webfiles:
|
||||
|
||||
On Windows:
|
||||
|
@ -12,14 +7,14 @@ in Applications\Benchmarks\SpecWeb99\webfiles type
|
|||
On Singularity:
|
||||
|
||||
First run:
|
||||
- "mkfs /dev/vol2"
|
||||
- "fsmount /dev/vol2 /fs -n" [no caching]
|
||||
- "fatcontrol @format /dev/vol2"
|
||||
- "fatcontrol @mount /dev/vol2 /fs"
|
||||
- "wafgen99 -v 10 /fs" [Generates lots of files]
|
||||
- "fsunmount"
|
||||
- "fatcontrol @unmount"
|
||||
- reboot to clear the log.
|
||||
|
||||
Second boot:
|
||||
- "fsmount /dev/vol2 /fs"
|
||||
- "fatcontrol @mount /dev/vol2 /fs"
|
||||
- "webfiles -r:60"
|
||||
|
||||
Alternatively, to run an fixed benchmark size, use the -f:X, forced
|
||||
|
|
|
@ -1,65 +1,65 @@
|
|||
#define NO_ZIPF_SPIKE
|
||||
|
||||
/*
|
||||
* (C)1997 Standard Performance Evaluation Corporation (SPEC)
|
||||
*
|
||||
* This suite contains code acquired from several sources who
|
||||
* understand and agree with SPEC's goal of creating fair and
|
||||
* objective benchmarks to measure computer performance.
|
||||
*
|
||||
* This copyright notice is placed here only to protect SPEC in the
|
||||
* event the source is misused in any manner that is contrary to
|
||||
* the spirit, the goals and the intent of SPEC.
|
||||
*
|
||||
* The source code is provided to the user or company under the
|
||||
* license agreement for the SPEC Benchmark Suite for this suite.
|
||||
*/
|
||||
//
|
||||
// (C)1997 Standard Performance Evaluation Corporation (SPEC)
|
||||
//
|
||||
// This suite contains code acquired from several sources who
|
||||
// understand and agree with SPEC's goal of creating fair and
|
||||
// objective benchmarks to measure computer performance.
|
||||
//
|
||||
// This copyright notice is placed here only to protect SPEC in the
|
||||
// event the source is misused in any manner that is contrary to
|
||||
// the spirit, the goals and the intent of SPEC.
|
||||
//
|
||||
// The source code is provided to the user or company under the
|
||||
// license agreement for the SPEC Benchmark Suite for this suite.
|
||||
//
|
||||
|
||||
/*****************************************************************
|
||||
* *
|
||||
* Copyright 1991,1992 Legato Systems, Inc. *
|
||||
* Copyright 1991,1992 Auspex Systems, Inc. *
|
||||
* Copyright 1991,1992 Data General Corporation *
|
||||
* Copyright 1991,1992 Digital Equipment Corporation *
|
||||
* Copyright 1991,1992 Interphase Corporation *
|
||||
* Copyright 1991,1992 Sun Microsystems, Inc. *
|
||||
* *
|
||||
*****************************************************************/
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// *
|
||||
// Copyright 1991,1992 Legato Systems, Inc. *
|
||||
// Copyright 1991,1992 Auspex Systems, Inc. *
|
||||
// Copyright 1991,1992 Data General Corporation *
|
||||
// Copyright 1991,1992 Digital Equipment Corporation *
|
||||
// Copyright 1991,1992 Interphase Corporation *
|
||||
// Copyright 1991,1992 Sun Microsystems, Inc. *
|
||||
// *
|
||||
/////////////////////////////////////////////////////////////////
|
||||
|
||||
/*
|
||||
* ---------------------- laddis_c_rnd.c ---------------------
|
||||
*
|
||||
* Random number generator.
|
||||
*
|
||||
*.Exported_routines
|
||||
* double Spec_random (RandomState *theState);
|
||||
* long Spec_nrandom (RandomState *theState);
|
||||
* void Spec_srandom (RandomState *theState, int seed);
|
||||
*
|
||||
*.Local_routines
|
||||
* None
|
||||
*
|
||||
*.Revision_History
|
||||
* 06-Nov-05 Convert to Sing#
|
||||
* 24-May-97 Chan-Nui Re-write to make thread-safe
|
||||
* 28-Nov-91 Teelucksingh ANSI C
|
||||
* 01-Aug-91 Wiryaman laddis_srandom() and laddis_random()whee
|
||||
* now use spec_srand() and spec_rand()
|
||||
* instead of srandom() and random().
|
||||
* 17-Apr-91 Wittle Created.
|
||||
*/
|
||||
//
|
||||
// ---------------------- laddis_c_rnd.c ---------------------
|
||||
//
|
||||
// Random number generator.
|
||||
//
|
||||
//.Exported_routines
|
||||
// double Spec_random (RandomState *theState);
|
||||
// long Spec_nrandom (RandomState *theState);
|
||||
// void Spec_srandom (RandomState *theState, int seed);
|
||||
//
|
||||
//.Local_routines
|
||||
// None
|
||||
//
|
||||
//.Revision_History
|
||||
// 06-Nov-05 Convert to Sing#
|
||||
// 24-May-97 Re-write to make thread-safe
|
||||
// 28-Nov-91 ANSI C
|
||||
// 01-Aug-91 laddis_srandom() and laddis_random()
|
||||
// now use spec_srand() and spec_rand()
|
||||
// instead of srandom() and random().
|
||||
// 17-Apr-91 Created.
|
||||
//
|
||||
|
||||
/*
|
||||
* Here's the source for the random number generator that SPEC uses.
|
||||
* The function to be called is "spec_rand" which returns an integer
|
||||
* between 1 and MAX_INT-1.
|
||||
*
|
||||
*/
|
||||
//
|
||||
// Here's the source for the random number generator that SPEC uses.
|
||||
// The function to be called is "spec_rand" which returns an integer
|
||||
// between 1 and MAX_INT-1.
|
||||
//
|
||||
//
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* UNIFORM Distribution *
|
||||
*****************************************************************************/
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// UNIFORM Distribution *
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
using System;
|
||||
using Singularity.Application.SPECWeb99;
|
||||
|
||||
|
@ -77,12 +77,12 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
public class Random
|
||||
{
|
||||
public const int A_MULTIPLIER = 16807;
|
||||
public const int M_MODULUS = 2147483647; /* (2**31)-1 */
|
||||
public const int Q_QUOTIENT = 127773; /* 2147483647 / 16807 */
|
||||
public const int R_REMAINDER = 2836; /* 2147483647 % 16807 */
|
||||
/*
|
||||
* Compute the next random number.
|
||||
*/
|
||||
public const int M_MODULUS = 2147483647; // (2**31)-1
|
||||
public const int Q_QUOTIENT = 127773; // 2147483647 / 16807
|
||||
public const int R_REMAINDER = 2836; // 2147483647 % 16807
|
||||
//
|
||||
//Compute the next random number.
|
||||
//
|
||||
public class RandomState
|
||||
{
|
||||
public int val;
|
||||
|
@ -130,11 +130,11 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
#endif
|
||||
|
||||
public double Spec_random(RandomState /*!*/ theState)
|
||||
/* See "Random Number Generators: Good Ones Are Hard To Find", */
|
||||
/* Park & Miller, CACM 31#10 October 1988 pages 1192-1201. */
|
||||
/***********************************************************/
|
||||
/* THIS IMPLEMENTATION REQUIRES AT LEAST 32 BIT INTEGERS ! */
|
||||
/***********************************************************/
|
||||
// See "Random Number Generators: Good Ones Are Hard To Find",
|
||||
// Park & Miller, CACM 31#10 October 1988 pages 1192-1201.
|
||||
///////////////////////////////////////////////////////////
|
||||
// THIS IMPLEMENTATION REQUIRES AT LEAST 32 BIT INTEGERS !
|
||||
///////////////////////////////////////////////////////////
|
||||
{
|
||||
int lo;
|
||||
int hi;
|
||||
|
@ -145,30 +145,31 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
test = A_MULTIPLIER * lo - R_REMAINDER * hi;
|
||||
if (test > 0) {
|
||||
theState.val = test;
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
theState.val = test + M_MODULUS;
|
||||
}
|
||||
return((float) theState.val / M_MODULUS);
|
||||
}
|
||||
|
||||
/*
|
||||
* Seed the random number generator.
|
||||
*/
|
||||
//
|
||||
//Seed the random number generator.
|
||||
//
|
||||
public void Spec_srandom( RandomState /*!*/ theState, int seed ) {
|
||||
theState.val = seed;
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns a random number.
|
||||
*/
|
||||
//
|
||||
//Returns a random number.
|
||||
//
|
||||
public int Spec_nrandom( RandomState/*!*/ theState ) {
|
||||
Spec_random(theState);
|
||||
return(theState.val);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* ZIPF Distribution *
|
||||
*****************************************************************************/
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//ZIPF Distribution *
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
public ZipfState spec_zipf_setup(RandomState rstate, int size, double Z)
|
||||
{
|
||||
|
@ -178,14 +179,14 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
ZipfState theState = new ZipfState(rstate, size);
|
||||
if (theState == null) return null;
|
||||
|
||||
/* compute zipf values for samples 1-n */
|
||||
// compute zipf values for samples 1-n
|
||||
for (i = 1; i <= size; i++) {
|
||||
theState.table[i] = Math.Pow(((double)1.0/((double)i)), Z);
|
||||
//theState.table[i] = 1; // SPL TOTAL HACK until POW works!!
|
||||
}
|
||||
|
||||
/* sum the values so we can compute probabilities. */
|
||||
/* at the same time, make the values cumulative */
|
||||
// sum the values so we can compute probabilities.
|
||||
// at the same time, make the values cumulative
|
||||
zipf_sum = 0.0;
|
||||
for (i = 1; i <= size; i++) {
|
||||
zipf_sum += theState.table[i] ;
|
||||
|
@ -194,9 +195,9 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
theState.table[size] = 0.0;
|
||||
theState.table[0] = 0.0;
|
||||
|
||||
/* compute probability values by dividing by the sum. */
|
||||
/* also reverse the table so we have values starting at 1.0 */
|
||||
/* and descending to 0.0 (this is what spec_zipf needs) */
|
||||
// compute probability values by dividing by the sum.
|
||||
// also reverse the table so we have values starting at 1.0
|
||||
// and descending to 0.0 (this is what spec_zipf needs)
|
||||
for (i = 0; i < size; i++) {
|
||||
theState.table[i] = 1.0 - (theState.table[i]/zipf_sum);
|
||||
}
|
||||
|
@ -224,7 +225,7 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
i++;
|
||||
}
|
||||
#if NO_ZIPF_SPIKE
|
||||
} while (i>theState.size);
|
||||
} while (i > theState.size);
|
||||
#endif
|
||||
return i-1;
|
||||
}
|
||||
|
@ -233,9 +234,9 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
|
||||
|
||||
#if STATIC_NORMAL_DIST
|
||||
/* Right now, mean and stddev are ignored. If someone has a good function to
|
||||
generate the cdf for normal distributions, let me know... */
|
||||
/* size=20, mean = 10, stddev = 3.5, will generate numbers from 0 to 20 */
|
||||
// Right now, mean and stddev are ignored. If someone has a good function to
|
||||
// generate the cdf for normal distributions, let me know...
|
||||
// size=20, mean = 10, stddev = 3.5, will generate numbers from 0 to 20
|
||||
NormalState spec_normal_setup(, RandomState rstate, double mean, double stddev) {
|
||||
|
||||
double normal_dist[] = {
|
||||
|
@ -297,16 +298,16 @@ int spec_nnormal(NormalState theState) {
|
|||
|
||||
#else
|
||||
|
||||
/* Guts of this routine are based on: */
|
||||
/* boxmuller.c Implements the Polar form of the Box-Muller
|
||||
Transformation
|
||||
|
||||
(c) Copyright 1994, Everett F. Carter Jr.
|
||||
Permission is granted by the author to use
|
||||
this software for any application provided this
|
||||
copyright notice is preserved.
|
||||
|
||||
*/
|
||||
// Guts of this routine are based on:
|
||||
// boxmuller.c Implements the Polar form of the Box-Muller
|
||||
// Transformation
|
||||
//
|
||||
// (c) Copyright 1994, Everett F. Carter Jr.
|
||||
// Permission is granted by the author to use
|
||||
// this software for any application provided this
|
||||
// copyright notice is preserved.
|
||||
//
|
||||
//
|
||||
|
||||
private NormalState spec_normal_setup(NormalState/*!*/ theState,
|
||||
RandomState/*!*/ rstate,
|
||||
|
@ -328,7 +329,7 @@ int spec_nnormal(NormalState theState) {
|
|||
{
|
||||
double x1, x2, w, y1;
|
||||
|
||||
if (theState.use_last ) { /* use value from previous call */
|
||||
if (theState.use_last) { // use value from previous call
|
||||
y1 = theState.y2;
|
||||
}
|
||||
else {
|
||||
|
@ -336,7 +337,7 @@ int spec_nnormal(NormalState theState) {
|
|||
x1 = 2.0 * Spec_random(theState.rstate) - 1.0;
|
||||
x2 = 2.0 * Spec_random(theState.rstate) - 1.0;
|
||||
w = x1 * x1 + x2 * x2;
|
||||
} while ( w >= 1.0 );
|
||||
} while (w >= 1.0);
|
||||
|
||||
w = Math.Sqrt( (-2.0 * Math.Log( w ) ) / w );
|
||||
y1 = x1 * w;
|
||||
|
|
|
@ -1,10 +1,8 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Microsoft Research Singularity
|
||||
// ----------------------------------------------------------------------------
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
|
@ -12,7 +10,8 @@ using System.Text;
|
|||
|
||||
namespace Singularity.Application.SPECWeb99.WebFiles
|
||||
{
|
||||
class Cache {
|
||||
class Cache
|
||||
{
|
||||
private const bool verbose = false;
|
||||
private UrlSet cache;
|
||||
private UrlSet free;
|
||||
|
@ -52,7 +51,7 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
// now see if there are any urls available
|
||||
// if not either wait on or generate the global deck
|
||||
|
||||
while (client.urlDeck.pos == 0){
|
||||
while (client.urlDeck.pos == 0) {
|
||||
if (client.generatingUrls == false) {
|
||||
//Console.WriteLine("Generating cache");
|
||||
UrlSet temp = client.urlDeck;
|
||||
|
@ -77,8 +76,8 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
|
||||
// the global deck is ok -- prime our cache
|
||||
|
||||
if (client.urlDeck.pos > 0 ) {
|
||||
for (int i =0; i < cache.urls.Length && (client.urlDeck.pos > 0); i++) {
|
||||
if (client.urlDeck.pos > 0) {
|
||||
for (int i = 0; i < cache.urls.Length && (client.urlDeck.pos > 0); i++) {
|
||||
cache.urls[cache.pos++] =
|
||||
client.urlDeck.urls[--client.urlDeck.pos];
|
||||
}
|
||||
|
@ -88,7 +87,7 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
}
|
||||
|
||||
public void FreeUrl(FileSpec url) {
|
||||
if (free.pos+1 >= free.urls.Length) {
|
||||
if (free.pos + 1 >= free.urls.Length) {
|
||||
//Console.WriteLine("free cache full! de-allocating");
|
||||
url = null;
|
||||
return;
|
||||
|
|
|
@ -1,10 +1,8 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Microsoft Research Singularity
|
||||
// ----------------------------------------------------------------------------
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
// Simulate the file reading portion of the specweb99 test suite
|
||||
|
@ -98,7 +96,8 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
}
|
||||
#endif
|
||||
#if !SINGULARITY
|
||||
class FileReader {
|
||||
class FileReader
|
||||
{
|
||||
//const uint FILE_FLAG_NO_BUFFERING = 0x20000000;
|
||||
const uint FILE_FLAG_NO_BUFFERING = 0;
|
||||
const uint GENERIC_READ = 0x80000000;
|
||||
|
@ -147,7 +146,7 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
FILE_FLAG_NO_BUFFERING,
|
||||
0);
|
||||
|
||||
if (handle != IntPtr.Zero && handle != ((IntPtr) (-1)) ) {
|
||||
if (handle != IntPtr.Zero && handle != ((IntPtr) (-1))) {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
|
@ -185,7 +184,7 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
public class UrlSet
|
||||
{
|
||||
public int pos;
|
||||
public FileSpec[] urls;
|
||||
public FileSpec[]/*!*/ urls;
|
||||
|
||||
public UrlSet(int size)
|
||||
{
|
||||
|
@ -202,7 +201,7 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
private const int MAX_PATH = 256;
|
||||
private const int LINESIZE = 64;
|
||||
private const int MARKER_FREQ = 4096;
|
||||
private const int BUF_SIZE = 1024*1024; /* 1MB */
|
||||
private const int BUF_SIZE = 1024*1024; // 1MB
|
||||
private const int MAX_DECK = 1000;
|
||||
//////////////////////////////////
|
||||
// Pseudo-constants
|
||||
|
@ -220,16 +219,13 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
// Instance variables
|
||||
public Random.RandomState randomState;
|
||||
public bool generatingUrls;
|
||||
public Mutex globalLock;
|
||||
public Mutex syncLock;
|
||||
public UrlSet urlDeck;
|
||||
public UrlSet freeDeck;
|
||||
public UrlSet spareDeck;
|
||||
public Mutex/*!*/ globalLock;
|
||||
public Mutex/*!*/ syncLock;
|
||||
public UrlSet/*!*/ urlDeck;
|
||||
public UrlSet/*!*/ freeDeck;
|
||||
public UrlSet/*!*/ spareDeck;
|
||||
#if SINGULARITY
|
||||
public static TRef<DirectoryServiceContract.Imp:Ready> namespaceRootT;
|
||||
private long fileCount = 0;
|
||||
private long repeatCount = 0;
|
||||
private bool dumpTable = false;
|
||||
#else
|
||||
/// <summary>
|
||||
/// will not work for multiple threads!!!
|
||||
|
@ -237,12 +233,15 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
private static FileReader reader = new FileReader();
|
||||
#endif
|
||||
private long dirCount = 0;
|
||||
private long fileCount = 0;
|
||||
private long repeatCount = 0;
|
||||
private static long blockSize = 0;
|
||||
private long totalSize = 0;
|
||||
private long fileSizeNum = 0;
|
||||
private long classSizeNum = 0;
|
||||
private long threadNum = 1;
|
||||
private long verbose = 0;
|
||||
private bool dumpTable = false;
|
||||
private bool testMode = false;
|
||||
private int runTime;
|
||||
private int rampTime;
|
||||
|
@ -268,9 +267,7 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
private class LocalState
|
||||
{
|
||||
public WorkerState State;
|
||||
#if SINGULARITY
|
||||
public DateTime StartTime;
|
||||
#endif
|
||||
public long bindCount;
|
||||
public TimeSpan bindTime;
|
||||
public long readCount;
|
||||
|
@ -292,9 +289,7 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
}
|
||||
}
|
||||
|
||||
#if SINGULARITY
|
||||
[NotDelayed]
|
||||
#endif
|
||||
public Client(string/*!*/ prefix, long dir,
|
||||
long bSize, long fSize,
|
||||
long threads, long verbose,
|
||||
|
@ -322,7 +317,6 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
fileBucket = new int [FILES_PER_CLASS];
|
||||
sb = new StringBuilder(512);
|
||||
|
||||
if (sb == null) throw new Exception (" could not allocate memory for string builder");
|
||||
#if SINGULARITY
|
||||
namespaceRootT = new TRef<DirectoryServiceContract.Imp:Ready>(
|
||||
DirectoryService.NewClientEndpoint());
|
||||
|
@ -330,9 +324,9 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
#endif
|
||||
workerLocalStates = new LocalState[threads];
|
||||
|
||||
if (workerLocalStates == null) {
|
||||
throw new Exception ("unable to alloc workerstats");
|
||||
}
|
||||
#if SINGULARITY
|
||||
base();
|
||||
#endif // SINGULARITY
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------
|
||||
|
@ -341,7 +335,7 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
// throw the content away (no copying, no converting etc...)
|
||||
//------------------------------------------------------------------
|
||||
|
||||
// FIXFIX way this is called is rather bizarre.
|
||||
// TODO: The way this is called is rather bizarre. Fix it.
|
||||
// a Client spawns LocalWorker objects that call back to this
|
||||
// function. Should be moved into the LoadWorker class
|
||||
|
||||
|
@ -365,16 +359,17 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
|
||||
// only perform timing while in the run state
|
||||
|
||||
DirectoryServiceContract.Imp:Ready! ds = Client.namespaceRootT.Acquire();
|
||||
DirectoryServiceContract.Imp:Ready! ds = ((!)Client.namespaceRootT).Acquire();
|
||||
ErrorCode errorCode = ErrorCode.Unknown;
|
||||
try {
|
||||
if (currentState == WorkerState.Run) {
|
||||
start = DateTime.Now;
|
||||
conn = FileUtils.OpenFile(fileName, ds, out errorCode);
|
||||
btime = DateTime.Now - start;
|
||||
btime = DateTime.Now - start;
|
||||
local.bindTime += btime;
|
||||
local.bindCount++;
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
conn = FileUtils.OpenFile(fileName, ds, out errorCode);
|
||||
}
|
||||
}
|
||||
|
@ -418,7 +413,8 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
}
|
||||
|
||||
if (currentState == WorkerState.Run) {
|
||||
local.totalTime += DateTime.Now - beginTotal;
|
||||
DateTime end = DateTime.Now;
|
||||
local.totalTime += end - beginTotal;
|
||||
}
|
||||
return inBuf;
|
||||
}
|
||||
|
@ -430,12 +426,13 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
public void GenerateFileSpecs()
|
||||
{
|
||||
FileSpec fs;
|
||||
|
||||
long size, linkCount;
|
||||
uint flags;
|
||||
double totalProb = 0.0;
|
||||
|
||||
|
||||
UrlSet fr = freeDeck;
|
||||
UrlSet sp = spareDeck;
|
||||
UrlSet/*!*/ fr = freeDeck;
|
||||
UrlSet/*!*/ sp = spareDeck;
|
||||
|
||||
//
|
||||
// Ensure the spare deck is fully allocated
|
||||
|
@ -454,8 +451,8 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
|
||||
// NOTE allocation should mostly happen during the initialization phase
|
||||
|
||||
for (int i=0; i < fr.urls.Length; i++){
|
||||
if (fr.pos == 0 ) {
|
||||
for (int i = 0; i < fr.urls.Length; i++) {
|
||||
if (fr.pos == 0) {
|
||||
//if ( sp.urls[i] != null) DebugStub.Break();
|
||||
sp.urls[i] = new FileSpec();
|
||||
if (sp.urls[i] == null) {
|
||||
|
@ -476,7 +473,7 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
// The loop immediately below will generate s set of files conforming to the
|
||||
// requested probabilities but will not be random.
|
||||
|
||||
for (int classNo = 0; classNo < MAX_CLASS_COUNT; classNo++) {
|
||||
for (int classNo = 0; classNo < MAX_CLASS_COUNT; classNo++) {
|
||||
totalProb += CLASS_PROB[classNo];
|
||||
while (sp.pos < totalProb * sp.urls.Length) {
|
||||
fs = sp.urls[sp.pos++];
|
||||
|
@ -507,8 +504,10 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
}
|
||||
}
|
||||
|
||||
/* Randomize deck */
|
||||
for (int i = 0; i < sp.pos ; i++) {
|
||||
// Randomize deck
|
||||
for (int i = 0; i < sp.pos; i++) {
|
||||
/*^ assert this.randomState != null; ^*/
|
||||
/*^ assert this.rand != null; ^*/
|
||||
int pos = rand.Spec_nrandom(randomState) % (sp.pos - i);
|
||||
FileSpec obj = sp.urls[sp.pos- i - 1];
|
||||
sp.urls[sp.pos - i - 1] = sp.urls[pos];
|
||||
|
@ -526,9 +525,7 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
{
|
||||
private Client hostClient;
|
||||
private LocalState localState;
|
||||
#if SINGULARITY
|
||||
private readonly ArrayList fs;
|
||||
#endif
|
||||
private StringBuilder sb;
|
||||
private int readSize;
|
||||
private Cache cache;
|
||||
|
@ -621,6 +618,8 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
// Allocate one one buffer for all operations
|
||||
byte[] buf = new byte [blockSize];
|
||||
#endif
|
||||
long size;
|
||||
|
||||
// if loop we've been told to quit, but run at least the forcedIterations.
|
||||
for (int iterations = 0;; iterations++) {
|
||||
if (iterations >= localState.forcedIterations &&
|
||||
|
@ -684,6 +683,7 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
/// manages Global state machine via timers etc.
|
||||
public void GenerateLoad()
|
||||
{
|
||||
ArrayList/*!*/ urlList;
|
||||
totalSize = 0;
|
||||
double megaBytes;
|
||||
InitializeGlobalState();
|
||||
|
@ -696,19 +696,16 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
long startIrqCount;
|
||||
long startSwitchCount;
|
||||
long startKernelGcCount;
|
||||
#endif
|
||||
int startGcCount;
|
||||
long startGcMillis;
|
||||
long startGcBytes;
|
||||
DateTime startTime;
|
||||
|
||||
long endGcMillis;
|
||||
long endGcBytes;
|
||||
TimeSpan startTime;
|
||||
TimeSpan endTime;
|
||||
#else
|
||||
DateTime startTime;
|
||||
DateTime endTime;
|
||||
#endif
|
||||
|
||||
//DateTime globalStartTime = ProcessService.GetUpTime();
|
||||
//DateTime globalStartTime = DateTime.Now;
|
||||
|
||||
// Create all the workers
|
||||
LoadWorker[] workers = new LoadWorker[threadNum];
|
||||
|
@ -734,7 +731,7 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
currentState = WorkerState.Rampup;
|
||||
for (int i = 0; i < threadNum; i++) {
|
||||
Thread t = threads[i];
|
||||
/*^ assume t!= null; ^*/
|
||||
/*^ assume t!= null; ^*/
|
||||
t.Start();
|
||||
}
|
||||
|
||||
|
@ -749,7 +746,7 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
out startGcMillis,
|
||||
out startGcBytes);
|
||||
|
||||
startTime = ProcessService.GetUpTime();
|
||||
startTime = DateTime.Now;
|
||||
startIrqCount = ProcessService.GetKernelInterruptCount();
|
||||
startSwitchCount = ProcessService.GetContextSwitchCount();
|
||||
startKernelGcCount = ProcessService.GetKernelGcCount();
|
||||
|
@ -764,7 +761,7 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
out startGcMillis,
|
||||
out startGcBytes);
|
||||
|
||||
startTime = ProcessService.GetUpTime();
|
||||
startTime = DateTime.Now;
|
||||
startIrqCount = ProcessService.GetKernelInterruptCount();
|
||||
startSwitchCount = ProcessService.GetContextSwitchCount();
|
||||
startKernelGcCount = ProcessService.GetKernelGcCount();
|
||||
|
@ -777,7 +774,7 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
currentState = WorkerState.Rampup;
|
||||
for (int i = 0; i < threadNum; i++) {
|
||||
Thread t = threads[i];
|
||||
/*^ assume t!= null; ^*/
|
||||
/*^ assume t!= null; ^*/
|
||||
t.Start();
|
||||
}
|
||||
|
||||
|
@ -812,22 +809,23 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
if (wasActive) Console.WriteLine("May want to reset Monitoring state -- was active");
|
||||
Monitoring.setActive(false);
|
||||
// Wait for all the threads to complete
|
||||
for (int i = 0 ; i < threadNum; i++) {
|
||||
for (int i = 0; i < threadNum; i++) {
|
||||
Thread t = threads[i];
|
||||
/*^ assume t!= null; ^*/
|
||||
/*^ assume t!= null; ^*/
|
||||
t.Join();
|
||||
}
|
||||
#endif
|
||||
|
||||
// should stats happen before or after thread join?
|
||||
// REVIEW: Should stats happen before or after thread join?
|
||||
|
||||
long totalFiles;
|
||||
long totalBytes = GatherStats(out totalFiles);
|
||||
|
||||
megaBytes = ( (double) (totalBytes) / (double) (1024*1024) );
|
||||
|
||||
#if SINGULARITY
|
||||
int endGcCount;
|
||||
endTime = ProcessService.GetUpTime();
|
||||
#if SINGULARITY
|
||||
endTime = DateTime.Now;
|
||||
GC.PerformanceCounters(out endGcCount,
|
||||
out endGcMillis,
|
||||
out endGcBytes);
|
||||
|
@ -859,21 +857,21 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
#else
|
||||
string info = "not implemented";
|
||||
#endif
|
||||
if (verbose > 0 ) {
|
||||
if (verbose > 0) {
|
||||
Console.WriteLine();
|
||||
Console.WriteLine(summ);
|
||||
Console.WriteLine(info);
|
||||
}
|
||||
|
||||
|
||||
if (verbose > 1 ) {
|
||||
if (verbose > 1) {
|
||||
long ftotal = 0;
|
||||
for (int i=0; i < 9; i++) {
|
||||
for (int i = 0; i < 9; i++) {
|
||||
ftotal += fileBucket[i];
|
||||
}
|
||||
|
||||
Console.WriteLine("Actual Zipf file distribution:");
|
||||
for (int i=0; i < 9; i++) {
|
||||
for (int i = 0; i < 9; i++) {
|
||||
double foo = (double) (fileBucket[i] * 100) / (double) ftotal;
|
||||
Console.WriteLine(" FileBucket[{0}] = {1:d6}. %={2:f2}",
|
||||
i, fileBucket[i], foo);
|
||||
|
@ -900,17 +898,17 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
out long value)
|
||||
{
|
||||
// arg should look like "[-][A-z]:[0-9]*"
|
||||
if (arg.Length >= 4)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (arg.Length >= 4) {
|
||||
try {
|
||||
value = Int64.Parse(arg.Substring(3));
|
||||
return true;
|
||||
}
|
||||
catch (FormatException)
|
||||
{Console.WriteLine("format ex"); }
|
||||
catch (OverflowException)
|
||||
{Console.WriteLine("overflow ex");}
|
||||
catch (FormatException) {
|
||||
Console.WriteLine("format ex");
|
||||
}
|
||||
catch (OverflowException) {
|
||||
Console.WriteLine("overflow ex");
|
||||
}
|
||||
}
|
||||
Console.WriteLine("Could not parse {0}, {1}", name,arg.Substring(3));
|
||||
value = 0;
|
||||
|
@ -958,6 +956,7 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
rampTime = 0;
|
||||
runTime = 0;
|
||||
}
|
||||
|
||||
Console.WriteLine(" args: content=" + contentPrefix +" dir=" + dirCount + " block size="+blockSize);
|
||||
Console.WriteLine(" verbose="+verbose+" FileSizeNum="+fileSizeNum+" ClassSizeNum="+classSizeNum);
|
||||
Console.WriteLine(" threads="+numThreads+" forcedIterations="+forcedIterations);
|
||||
|
@ -968,7 +967,7 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
testMode, (int) rampTime, (int)runTime,
|
||||
(int)forcedIterations);
|
||||
|
||||
if (c != null ) {
|
||||
if (c != null) {
|
||||
c.GenerateLoad();
|
||||
}
|
||||
|
||||
|
@ -999,19 +998,17 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
bool needHelp = args.Length == 0;
|
||||
|
||||
int i;
|
||||
for (i = 1; i < args.Length; i++)
|
||||
{
|
||||
for (i = 1; i < args.Length; i++) {
|
||||
string/*!*/ arg = (string /*!*/) args[i];
|
||||
|
||||
if (arg.Length < 2 || (arg[0] != '-' && arg[0] != '/') )
|
||||
{
|
||||
if (arg.Length < 2 || (arg[0] != '-' && arg[0] != '/')) {
|
||||
Console.WriteLine("Invalid argument: {0}", arg);
|
||||
Usage();
|
||||
return -1;
|
||||
}
|
||||
|
||||
switch (Char.ToLower(arg[1]))
|
||||
{
|
||||
long temp;
|
||||
switch (Char.ToLower(arg[1])) {
|
||||
case '?':
|
||||
case 'h':
|
||||
needHelp = true;
|
||||
|
@ -1075,7 +1072,7 @@ namespace Singularity.Application.SPECWeb99.WebFiles
|
|||
testMode, (int) rampTime, (int)runTime,
|
||||
(int)forcedIterations);
|
||||
|
||||
if (c != null ) {
|
||||
if (c != null) {
|
||||
c.GenerateLoad();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
<!--
|
||||
###############################################################################
|
||||
#
|
||||
# Microsoft Research Singularity
|
||||
#
|
||||
# Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
#
|
||||
###############################################################################
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
clear
|
||||
mkfs '/dev/vol0.2'
|
||||
fsmount '/dev/vol0.2' '/fs' '-n'
|
||||
fatcontrol '@format' '/dev/vol0.2'
|
||||
fatcontrol '@mount' '/dev/vol0.2' '/fs'
|
||||
wafgen99 '-v' '60' '/fs'
|
||||
clear
|
||||
echo '=============================================================================='
|
||||
echo 'When fsunmount says that the volume has been unmounted, initialization is
|
||||
echo 'complete. You must manually reset the machine to start the xwebfile benchmark.'
|
||||
echo 'When unmount has completed the initialization is complete.
|
||||
echo 'You must manually reset the machine to start the xwebfile benchmark.'
|
||||
echo '=============================================================================='
|
||||
echo 'fsunmount:'
|
||||
fsunmount
|
||||
echo 'Unmounting...'
|
||||
fatcontrol @unmount '/fs'
|
||||
echo '...Unmount completed.'
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -5,8 +5,6 @@ Microsoft Research Singularity
|
|||
|
||||
Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
|
||||
File: Applications\YourApp\YourApp.csproj
|
||||
|
||||
Note: This is the template for a basic console app.
|
||||
|
||||
##############################################################################
|
||||
|
@ -19,7 +17,7 @@ Note: This is the template for a basic console app.
|
|||
without requiring that you set environment variables for VS.
|
||||
-->
|
||||
<Import Project="..\..\Paths.targets"/>
|
||||
|
||||
|
||||
<PropertyGroup>
|
||||
<AssemblyName>Bartok</AssemblyName>
|
||||
<OutputType>Exe</OutputType>
|
||||
|
@ -50,13 +48,18 @@ Note: This is the template for a basic console app.
|
|||
<Reference Include="msil\Bartok.Regalloc.dll"/>
|
||||
<Reference Include="msil\Bartok.Tables.dll"/>
|
||||
<Reference Include="msil\Bartok.Utility.dll"/>
|
||||
|
||||
|
||||
<ProjectReference Include="$(SINGULARITY_ROOT)\Contracts\FileSystem.Contracts\FileSystem.Contracts.csproj"/>
|
||||
<ProjectReference Include="$(SINGULARITY_ROOT)\Libraries\System.IO\System.IO.csproj"/>
|
||||
<ProjectReference Include="$(SINGULARITY_ROOT)\Libraries\FileSystem.Utils\FileSystem.Utils.csproj"/>
|
||||
<ProjectReference Include="$(SINGULARITY_ROOT)\Libraries\DirectoryService.Utils\DirectoryService.Utils.csproj"/>
|
||||
<ProjectReference Include="$(SINGULARITY_ROOT)\Libraries\Security\Security.csproj"/>
|
||||
</ItemGroup>
|
||||
|
||||
<!-- Include all of the MSIL assemblies needed to build the kernel -->
|
||||
<Content Include="Kernel\Kernel.exe"/>
|
||||
<Content Include="Kernel\*.dll"/>
|
||||
<Content Include="Kernel\*.pdb"/>
|
||||
</ItemGroup>
|
||||
|
||||
<Import Project="$(SINGULARITY_ROOT)\Targets\ConsoleCategory.targets"/>
|
||||
</Project>
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
@echo.
|
||||
@echo *** Checking out Bartok MSIL files.
|
||||
@echo.
|
||||
sd edit msil\bartok.*
|
||||
@if errorlevel 1 goto exit
|
||||
|
||||
@echo.
|
||||
@echo *** Copying files from Bartok enlistment.
|
||||
@echo.
|
||||
|
||||
@if exist c:\othercode\act\bartok\obj\sing-debug-x86-x86\nul (
|
||||
copy c:\othercode\act\bartok\obj\sing-debug-x86-x86\bartok.* msil
|
||||
@if errorlevel 1 goto exit
|
||||
)
|
||||
|
||||
@if exist c:\act\bartok\obj\sing-debug-x86-x86\nul (
|
||||
copy c:\act\bartok\obj\sing-debug-x86-x86\bartok.* msil
|
||||
@if errorlevel 1 goto exit
|
||||
)
|
||||
|
||||
@if exist c:\home\act-dev7\bartok\obj\sing-debug-x86-x86\nul (
|
||||
copy c:\home\act-dev7\bartok\obj\sing-debug-x86-x86\bartok.* msil
|
||||
@if errorlevel 1 goto exit
|
||||
)
|
||||
|
||||
@echo.
|
||||
@echo *** Deleting unused files.
|
||||
@echo.
|
||||
del msil\bartok.tryallextension.* 2>nul
|
|
@ -0,0 +1 @@
|
|||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue