TestEnvironment.java 12.8 KB
Newer Older
1 2
package mvd.jester;

3
import java.lang.management.ManagementFactory;
4 5
import java.util.ArrayList;
import java.util.LinkedHashMap;
6
import java.util.List;
7
import java.util.Map;
8
import java.util.Set;
Michael Schmid committed
9 10
import java.util.Map.Entry;
import java.util.concurrent.ThreadLocalRandom;
11
import mvd.jester.info.SchedulingInfo;
12
import mvd.jester.info.SchedulingInfo.Feasiblity;
13 14 15
import mvd.jester.model.DagTask;
import mvd.jester.model.SortedTaskSet;
import mvd.jester.model.SynchronousTask;
Michael Schmid committed
16
import mvd.jester.model.SystemManager;
17
import mvd.jester.model.Task;
Michael Schmid committed
18 19
import mvd.jester.model.SystemManager.DagTaskBuilder;
import mvd.jester.model.SystemManager.SynchronousTaskBuilder;
20
import mvd.jester.priority.PriorityManager;
21 22 23 24 25 26 27
import mvd.jester.tests.AbstractTest;

/**
 * TestEnvironment
 */
public class TestEnvironment {

28

29
    public TestEnvironment() {
30 31
    }

32 33
    public <T extends Task> List<AbstractTest<T>> registerTests(final List<AbstractTest<T>> tests) {
        return new ArrayList<>(tests);
34 35 36
    }


37 38 39
    public void runExperiments(final SynchronousTaskBuilder builder,
            final Set<ResultCollector<AbstractTest<SynchronousTask>>> abstractTestInstances,
            final long numberOfProcessors, final long numberOfTaskSets) {
40

41
        long checkedTasksets = 0;
42 43
        System.out.print(Math.round((double) checkedTasksets / numberOfTaskSets * 100) + "% of "
                + numberOfTaskSets + " tasksets tested!\r");
44
        while (checkedTasksets < numberOfTaskSets) {
45
            final Set<SynchronousTask> tasks = builder.generateTaskSet();
46

47
            double utilization = tasks.stream().mapToDouble(SynchronousTask::getUtilization).sum();
48

49
            while (utilization <= numberOfProcessors && checkedTasksets < numberOfTaskSets) {
50 51
                checkedTasksets++;

52
                if (checkedTasksets % 10 == 0) {
53 54
                    System.out.print(Math.round((double) checkedTasksets / numberOfTaskSets * 100)
                            + "% of " + numberOfTaskSets + " tasksets tested!\r");
55 56
                }

57 58 59 60
                for (final ResultCollector<AbstractTest<SynchronousTask>> testInstance : abstractTestInstances) {
                    final PriorityManager priorityManager = testInstance.getPriorityManager();
                    final AbstractTest<SynchronousTask> abstractTest =
                            testInstance.getAbstractValue();
61

62
                    final SortedTaskSet<SynchronousTask> sortedTaskSet =
63 64
                            new SortedTaskSet<>(priorityManager);
                    sortedTaskSet.addAll(tasks);
65
                    final SchedulingInfo schedulingInfo =
66
                            abstractTest.runSchedulabilityCheck(sortedTaskSet);
67
                    testInstance.addResult(schedulingInfo);
Michael Schmid committed
68 69
                }

70
                builder.addTask(tasks);
71

72 73 74 75
                utilization = tasks.stream().mapToDouble(SynchronousTask::getUtilization).sum();
            }
        }
        System.out.println("");
Michael Schmid committed
76
        // final ResultLogger resultLogger = new ResultLogger(numberOfProcessors);
Michael Schmid committed
77

78
        // resultLogger.logTests(abstractTestInstances);
79 80
    }

81 82
    public void measureExecutionTimes(final SystemManager<DagTaskBuilder> manager,
            final List<AbstractTest<DagTask>> abstractTestInstances,
83
            final long numberOfMeasurements) {
Michael Schmid committed
84 85 86
        Map<AbstractTest<DagTask>, List<Long>> results = new LinkedHashMap<>();
        abstractTestInstances.forEach(t -> results.put(t, new ArrayList<>()));
        for (int i = 0; i < numberOfMeasurements; ++i) {
87 88
            double utilization =
                    ThreadLocalRandom.current().nextDouble(1, manager.getNumberOfProcessors());
89
            Set<DagTask> taskSet = manager.getBuilder().generateTaskSet(utilization);
Michael Schmid committed
90 91 92 93 94
            for (AbstractTest<DagTask> testInstance : abstractTestInstances) {
                final PriorityManager priorityManager = testInstance.getPriorityManager();

                final SortedTaskSet<DagTask> sortedTaskSet = new SortedTaskSet<>(priorityManager);
                sortedTaskSet.addAll(taskSet);
95
                long timeBefore = ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();
Michael Schmid committed
96
                testInstance.runSchedulabilityCheck(sortedTaskSet);
97
                long timeAfter = ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();
98
                long micros = (timeAfter - timeBefore) / 1000;
Michael Schmid committed
99 100 101 102 103 104 105 106 107 108 109 110
                results.get(testInstance).add(micros);
            }
        }

        for (Entry<AbstractTest<DagTask>, List<Long>> entry : results.entrySet()) {
            long size = entry.getValue().size();
            long total = entry.getValue().stream().reduce((long) 0, Long::sum);
            System.out.println(entry.getKey().getName() + ": " + (double) total / size + " µs");
        }

    }

111 112
    public void varyNumberOfProcessors(final SystemManager<DagTaskBuilder> manager,
            final List<AbstractTest<DagTask>> abstractTestInstances,
Michael Schmid committed
113 114 115 116 117 118 119 120 121 122 123 124 125
            final long numberOfTaskSetsPerStep) {
        long checkedTasksets = 0;
        final long numberOfTaskSets = 8 * numberOfTaskSetsPerStep;

        final ResultLogger resultLogger = new ResultLogger("numberOfProcessors");
        final Map<AbstractTest<DagTask>, Long> resultMap = new LinkedHashMap<>();
        abstractTestInstances.forEach(t -> resultMap.put(t, (long) 0));
        resultLogger.logHeader(resultMap, "NoOfProcessors");

        for (long numberOfProcessors = 2; numberOfProcessors <= 16; numberOfProcessors += 2) {
            manager.setNumberOfProcessors(numberOfProcessors);
            resultMap.replaceAll((k, v) -> (long) 0);
            for (int i = 0; i < numberOfTaskSetsPerStep; ++i) {
126
                final Set<DagTask> taskSet = manager.getBuilder().generateUUnifastTaskSet(
Michael Schmid committed
127
                        (long) (1.5 * numberOfProcessors), (double) numberOfProcessors * 0.5);
128

129
                System.out.print(checkedTasksets + "/" + numberOfTaskSets + " tasksets tested!\r");
Michael Schmid committed
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
                for (final AbstractTest<DagTask> testInstance : abstractTestInstances) {
                    final PriorityManager priorityManager = testInstance.getPriorityManager();

                    final SortedTaskSet<DagTask> sortedTaskSet =
                            new SortedTaskSet<>(priorityManager);
                    sortedTaskSet.addAll(taskSet);
                    final SchedulingInfo schedulingInfo =
                            testInstance.runSchedulabilityCheck(sortedTaskSet);

                    if (schedulingInfo.getFeasibility() == Feasiblity.SUCCEEDED) {
                        resultMap.computeIfPresent(testInstance, (k, v) -> v + 1);
                    }
                }
                checkedTasksets++;
            }
            resultLogger.logLine(numberOfProcessors, resultMap);
            resultLogger.newLine();
        }
        System.out.println("");
        resultLogger.finalize();
    }


153 154
    public void varyNumberOfTasks(final SystemManager<DagTaskBuilder> manager,
            final List<AbstractTest<DagTask>> abstractTestInstances,
Michael Schmid committed
155 156
            final long numberOfTaskSetsPerStep) {
        long checkedTasksets = 0;
157
        final long numberOfProcessors = manager.getNumberOfProcessors();
Michael Schmid committed
158 159 160 161 162 163 164 165 166 167
        final long numberOfTaskSets = 9 * numberOfTaskSetsPerStep;

        final ResultLogger resultLogger = new ResultLogger("numberOfTasks_" + numberOfProcessors);
        final Map<AbstractTest<DagTask>, Long> resultMap = new LinkedHashMap<>();
        abstractTestInstances.forEach(t -> resultMap.put(t, (long) 0));
        resultLogger.logHeader(resultMap, "NoOfTasks");

        for (long numberOfTasks = 4; numberOfTasks <= 20; numberOfTasks += 2) {
            resultMap.replaceAll((k, v) -> (long) 0);
            for (int i = 0; i < numberOfTaskSetsPerStep; ++i) {
168 169
                final Set<DagTask> taskSet = manager.getBuilder()
                        .generateUUnifastTaskSet(numberOfTasks, (double) numberOfProcessors * 0.5);
Michael Schmid committed
170

171
                System.out.print(checkedTasksets + "/" + numberOfTaskSets + " tasksets tested!\r");
Michael Schmid committed
172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
                for (final AbstractTest<DagTask> testInstance : abstractTestInstances) {
                    final PriorityManager priorityManager = testInstance.getPriorityManager();

                    final SortedTaskSet<DagTask> sortedTaskSet =
                            new SortedTaskSet<>(priorityManager);
                    sortedTaskSet.addAll(taskSet);
                    final SchedulingInfo schedulingInfo =
                            testInstance.runSchedulabilityCheck(sortedTaskSet);

                    if (schedulingInfo.getFeasibility() == Feasiblity.SUCCEEDED) {
                        resultMap.computeIfPresent(testInstance, (k, v) -> v + 1);
                    }
                }
                checkedTasksets++;
            }
            resultLogger.logLine(numberOfTasks, resultMap);
            resultLogger.newLine();
        }
        System.out.println("");
        resultLogger.finalize();
    }

194 195
    public void varyUtilization(final SystemManager<DagTaskBuilder> manager,
            final List<AbstractTest<DagTask>> abstractTestInstances,
196
            final long numberOfTaskSetsPerUtil) {
197
        final long numberOfProcessors = manager.getNumberOfProcessors();
198
        long checkedTasksets = 0;
199
        final long numberOfTaskSets = ((numberOfProcessors * 4) - 3) * numberOfTaskSetsPerUtil;
200

Michael Schmid committed
201
        final ResultLogger resultLogger = new ResultLogger("utilization_" + numberOfProcessors);
202 203
        final Map<AbstractTest<DagTask>, Long> resultMap = new LinkedHashMap<>();
        abstractTestInstances.forEach(t -> resultMap.put(t, (long) 0));
Michael Schmid committed
204 205
        resultLogger.logHeader(resultMap, "Utilization");

206
        for (double util = 1; util <= numberOfProcessors; util += 0.25) {
207
            resultMap.replaceAll((k, v) -> (long) 0);
208
            for (int i = 0; i < numberOfTaskSetsPerUtil; ++i) {
209
                final Set<DagTask> taskSet = manager.getBuilder().generateTaskSet(util);
210

211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233
                System.out.print(checkedTasksets + "/" + numberOfTaskSets + " tasksets tested!\r");
                for (final AbstractTest<DagTask> testInstance : abstractTestInstances) {
                    final PriorityManager priorityManager = testInstance.getPriorityManager();

                    final SortedTaskSet<DagTask> sortedTaskSet =
                            new SortedTaskSet<>(priorityManager);
                    sortedTaskSet.addAll(taskSet);
                    final SchedulingInfo schedulingInfo =
                            testInstance.runSchedulabilityCheck(sortedTaskSet);

                    if (schedulingInfo.getFeasibility() == Feasiblity.SUCCEEDED) {
                        resultMap.computeIfPresent(testInstance, (k, v) -> v + 1);
                    }
                }
                checkedTasksets++;
            }
            resultLogger.logLine(util, resultMap);
            resultLogger.newLine();
        }
        System.out.println("");
        resultLogger.finalize();
    }

234 235
    public void varyRenyiUtilization(final SystemManager<DagTaskBuilder> manager,
            final List<AbstractTest<DagTask>> abstractTestInstances,
236
            final long numberOfTaskSetsPerUtil) {
237
        final long numberOfProcessors = manager.getNumberOfProcessors();
238 239 240
        long checkedTasksets = 0;
        final long numberOfTaskSets = ((numberOfProcessors * 4) - 3) * numberOfTaskSetsPerUtil;

241 242
        final ResultLogger resultLogger =
                new ResultLogger("renyi_utilization_" + numberOfProcessors);
243 244 245 246
        final Map<AbstractTest<DagTask>, Long> resultMap = new LinkedHashMap<>();
        abstractTestInstances.forEach(t -> resultMap.put(t, (long) 0));
        resultLogger.logHeader(resultMap, "Utilization");

Michael Schmid committed
247
        for (double util = 1; util <= numberOfProcessors; util += (double)numberOfProcessors/32) {
248 249
            resultMap.replaceAll((k, v) -> (long) 0);
            for (int i = 0; i < numberOfTaskSetsPerUtil; ++i) {
250
                final Set<DagTask> taskSet = manager.getBuilder().generateRenyiTaskSet(util);
251 252

                System.out.print(checkedTasksets + "/" + numberOfTaskSets + " tasksets tested!\r");
253 254
                for (final AbstractTest<DagTask> testInstance : abstractTestInstances) {
                    final PriorityManager priorityManager = testInstance.getPriorityManager();
255

256 257
                    final SortedTaskSet<DagTask> sortedTaskSet =
                            new SortedTaskSet<>(priorityManager);
258
                    sortedTaskSet.addAll(taskSet);
259 260
                    final SchedulingInfo schedulingInfo =
                            testInstance.runSchedulabilityCheck(sortedTaskSet);
261 262 263 264

                    if (schedulingInfo.getFeasibility() == Feasiblity.SUCCEEDED) {
                        resultMap.computeIfPresent(testInstance, (k, v) -> v + 1);
                    }
265 266
                }
                checkedTasksets++;
267
            }
268 269
            resultLogger.logLine(util, resultMap);
            resultLogger.newLine();
270
        }
271
        System.out.println("");
272
        resultLogger.finalize();
273 274
    }
}
Michael Schmid committed
275 276