On 22 October 2014 03:39, pi-cheng.chen pi-cheng.chen@linaro.org wrote:
Some examples to use the script to generate small tasks workloads:
- to generate a workload with 4 threads, 10% load and 30ms period
$ ./small_task_gen -t 4 -l 10 -p 3
The period unit seems to be 10ms which is quite long, please use a more fine grained value; at least ms or even us
- to generate a workload with 3 threads, 15% load and random tick-aligned period
$ ./small_task_gen -t 3 -l 15 -r --aligned
- to generate a workload with 5 threads, 20% load and random non-tick-aligned period
$ ./small_task_gen -t 5 -l 20 -r --unaligned
What about a defined but unaligned period ? it doesn't seems to be possible
doc/examples/small_task_gen | 117 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100755 doc/examples/small_task_gen
diff --git a/doc/examples/small_task_gen b/doc/examples/small_task_gen new file mode 100755 index 0000000..ba74753 --- /dev/null +++ b/doc/examples/small_task_gen @@ -0,0 +1,117 @@ +#!/usr/bin/env python
+import sys +import getopt +import random
+outfile = "small_tasks.json" +tasks = None +loading = None +period = None +randomized = None +aligned = None
+def usage():
- print "Usage:"
- print sys.argv[0] + " -t <number of tasks>"
- print "\t\t -l <percentage of task loading> (1 - 100)"
- print "\t\t -p <fixed period in ms>"
- print "\t\t -r [--aligned | --unaligned] (randomize periods of tasks)"
- print "\t\t -o <output JSON file name> (default: small_tasks.json)"
- return
+def parse_options():
- global outfile
- global tasks
- global loading
- global period
- global randomized
- global aligned
- try:
opts, args = getopt.getopt(sys.argv[1:], "t:l:o:p:rh",
["aligned", "unaligned"])
- except getopt.GetoptError:
usage()
sys.exit(2)
- for o, a in opts:
if o == "-t":
tasks = int(a)
print "number of tasks: %d" % tasks
if o == "-l":
loading = int(a)
print "task loading: %d" % loading
if o == "-o":
outfile = a;
print "output workload JSON file: " + outfile
if o == "-p":
period = int(a)
print "period of tasks: %d" % period
if o == "-r":
randomized = True
print "randomized: %r" % randomized
if o == "--aligned":
if aligned == False:
usage()
sys.exit(2)
aligned = True
print "aligned: %r" % aligned
if o in "--unaligned":
if aligned == True:
usage()
sys.exit(2)
aligned = False
print "aligned: %r" % aligned
if o == "-h":
usage()
sys.exit(2)
- if not period is None and not randomized is None:
usage()
sys.exit(2)
- if tasks is None or (period is None and randomized is None):
usage()
sys.exit(2)
- return
+def generate_workload():
- try:
f = open(outfile, "w")
- except IOError:
print "WARN: Unable to open " + infile
sys.exit(2)
- f.write("{\n")
- f.write("\t"tasks" : {\n")
- for i in range(0, tasks):
if randomized is None:
period_ns = period * 1000
else:
period_ns = random.randrange(1, 6) * 10000 # random tick-aligned period from 10ms~50ms
the [10:50]ms range for the random period is quite arbitrary, we should be able to specify a range for the random value
if aligned == False: # add a period offset randomly from 1 of [300, 500, 700]
period_ns += (3000, 5000, 7000)[random.randrange(0, 3)]
yous should not specify a restricted list of random offset
run_ns = period_ns * loading / 100
f.write("\t\t\"thread%d\" : {\n" % i)
f.write("\t\t\t\"loop\" : -1,\n")
f.write("\t\t\t\"run\" : %d,\n" % run_ns)
f.write("\t\t\t\"timer\" : { \"ref\" : \"tick\", \"period\" : %d },\n" % period_ns)
you should use a different timer id for each task instead of sharing the tick timer between tasks
f.write("\t\t},\n")
- f.write("\t},\n")
- f.write("}\n")
As discussed, I still think that it's not straight forward to understand what the script is doing or to reuse it for another use case. But I haven't found a better way so far. IMO, the use of a model that is then modifed according parameters is a bit easier to use or reuse but i also agree that it's more complex to parse and modify a model than creating a json file from scratch
Regards, Vincent
- return
+if __name__ == '__main__':
- parse_options()
- generate_workload()
-- 1.9.1