On 22 October 2014 03:39, pi-cheng.chen <[email protected]> wrote:
> Some examples to use the script to generate small tasks workloads:
> 1. 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
>
> 2. to generate a workload with 3 threads, 15% load and random tick-aligned
> period
> $ ./small_task_gen -t 3 -l 15 -r --aligned
>
> 3. 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
>
_______________________________________________
linaro-dev mailing list
[email protected]
http://lists.linaro.org/mailman/listinfo/linaro-dev