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

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

/**
 * TestEnvironment
 */
public class TestEnvironment {

29

30
    public TestEnvironment() {
31 32
    }

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


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

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

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

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

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

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

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

71
                builder.addTask(tasks);
72

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

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

Michael Schmid committed
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
    public void measureExecutionTimes(final DagTaskBuilder builder,
            final List<AbstractTest<DagTask>> abstractTestInstances,
            final long numberOfMeasurements) {
        Map<AbstractTest<DagTask>, List<Long>> results = new LinkedHashMap<>();
        abstractTestInstances.forEach(t -> results.put(t, new ArrayList<>()));
        for (int i = 0; i < numberOfMeasurements; ++i) {
            double utilization = ThreadLocalRandom.current().nextDouble(1, 7);
            Set<DagTask> taskSet = builder.generateTaskSet(utilization);
            for (AbstractTest<DagTask> testInstance : abstractTestInstances) {
                final PriorityManager priorityManager = testInstance.getPriorityManager();

                final SortedTaskSet<DagTask> sortedTaskSet = new SortedTaskSet<>(priorityManager);
                sortedTaskSet.addAll(taskSet);
                Stopwatch w = Stopwatch.createStarted();
                testInstance.runSchedulabilityCheck(sortedTaskSet);
                w.stop();
                long micros = w.elapsed(TimeUnit.MICROSECONDS);
                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");
        }

    }

    public void varyNumberOfProcessors(final DagTaskBuilder builder,
            final List<AbstractTest<DagTask>> abstractTestInstances, SystemManager manager,
            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) {
                final Set<DagTask> taskSet = builder.generateUUnifastTaskSet(
                        (long) (1.5 * numberOfProcessors), (double) numberOfProcessors * 0.5);
128

Michael Schmid committed
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
                System.out.print(Math.round((double) checkedTasksets / numberOfTaskSets * 100)
                        + "% of " + 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(numberOfProcessors, resultMap);
            resultLogger.newLine();
        }
        System.out.println("");
        resultLogger.finalize();
    }


    public void varyNumberOfTasks(final DagTaskBuilder builder,
            final List<AbstractTest<DagTask>> abstractTestInstances, final long numberOfProcessors,
            final long numberOfTaskSetsPerStep) {
        long checkedTasksets = 0;
        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) {
                final Set<DagTask> taskSet = builder.generateUUnifastTaskSet(numberOfTasks,
                        (double) numberOfProcessors * 0.5);

                System.out.print(Math.round((double) checkedTasksets / numberOfTaskSets * 100)
                        + "% of " + 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(numberOfTasks, resultMap);
            resultLogger.newLine();
        }
        System.out.println("");
        resultLogger.finalize();
    }

    public void varyUtilization(final DagTaskBuilder builder,
196 197
            final List<AbstractTest<DagTask>> abstractTestInstances, final long numberOfProcessors,
            final long numberOfTaskSetsPerUtil) {
198 199

        long checkedTasksets = 0;
200
        final long numberOfTaskSets = ((numberOfProcessors * 4) - 3) * numberOfTaskSetsPerUtil;
201

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

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

                System.out.print(Math.round((double) checkedTasksets / numberOfTaskSets * 100)
                        + "% of " + numberOfTaskSets + " tasksets tested!\r");
214 215
                for (final AbstractTest<DagTask> testInstance : abstractTestInstances) {
                    final PriorityManager priorityManager = testInstance.getPriorityManager();
216

217 218
                    final SortedTaskSet<DagTask> sortedTaskSet =
                            new SortedTaskSet<>(priorityManager);
219
                    sortedTaskSet.addAll(taskSet);
220 221
                    final SchedulingInfo schedulingInfo =
                            testInstance.runSchedulabilityCheck(sortedTaskSet);
222 223 224 225

                    if (schedulingInfo.getFeasibility() == Feasiblity.SUCCEEDED) {
                        resultMap.computeIfPresent(testInstance, (k, v) -> v + 1);
                    }
226 227
                }
                checkedTasksets++;
228
            }
229 230
            resultLogger.logLine(util, resultMap);
            resultLogger.newLine();
231
        }
232
        System.out.println("");
233
        resultLogger.finalize();
234 235
    }
}
Michael Schmid committed
236 237