lkml.org 
[lkml]   [2017]   [Feb]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RESEND PATCH 1/2] documentation: Add scheduler/sched-avg.txt
    Date
    This doc file has the program to generate the constants to compute
    sched averages.

    Signed-off-by: Yuyang Du <yuyang.du@intel.com>
    ---
    Documentation/scheduler/sched-avg.txt | 94 +++++++++++++++++++++++++++++++++++
    1 file changed, 94 insertions(+)
    create mode 100644 Documentation/scheduler/sched-avg.txt

    diff --git a/Documentation/scheduler/sched-avg.txt b/Documentation/scheduler/sched-avg.txt
    new file mode 100644
    index 0000000..e1b3c542
    --- /dev/null
    +++ b/Documentation/scheduler/sched-avg.txt
    @@ -0,0 +1,94 @@
    +The following program is used to generate the constants for
    +computing sched averages.
    +
    +==============================================================
    + C program (compile with -lm)
    +==============================================================
    +
    +#include <math.h>
    +#include <stdio.h>
    +
    +#define HALFLIFE 32
    +#define SHIFT 32
    +
    +double y;
    +
    +void calc_runnable_avg_yN_inv() {
    + int i;
    + unsigned int x;
    +
    + printf("static const u32 runnable_avg_yN_inv[] = {");
    + for(i = 0; i < HALFLIFE; i++) {
    + x = ((1UL<<32)-1)*pow(y, i);
    +
    + if (i % 6 == 0) printf("\n\t");
    + printf("0x%8x, ", x);
    + }
    + printf("\n};\n\n");
    +}
    +
    +int sum = 1024;
    +void calc_runnable_avg_yN_sum() {
    + int i;
    +
    + printf("static const u32 runnable_avg_yN_sum[] = {\n\t 0,");
    + for(i = 1; i <= HALFLIFE; i++) {
    + if (i == 1)
    + sum *= y;
    + else
    + sum = sum*y + 1024*y;
    +
    + if (i % 11 == 0) printf("\n\t");
    + printf("%5d,", sum);
    + }
    + printf("\n};\n\n");
    +}
    +
    +int n = -1;
    +/* first period */
    +long max = 1024;
    +
    +void calc_converged_max() {
    + long last = 0, y_inv = ((1UL<<32)-1)*y;
    +
    + for (; ; n++) {
    + if (n > -1)
    + max = ((max*y_inv)>>SHIFT) + 1024;
    + /*
    + * This is the same as:
    + * max = max*y + 1024;
    + */
    +
    + if (last == max)
    + break;
    +
    + last = max;
    + }
    + n--;
    + printf("#define LOAD_AVG_PERIOD %d\n", HALFLIFE);
    + printf("#define LOAD_AVG_MAX %ld\n", max);
    + printf("#define LOAD_AVG_MAX_N %d\n\n", n);
    +}
    +
    +void calc_accumulated_sum_32() {
    + int i, x = sum;
    +
    + printf("static const u32 __accumulated_sum_N32[] = {\n\t 0,");
    + for(i = 1; i <= n/HALFLIFE+1; i++) {
    + if (i > 1)
    + x = x/2 + sum;
    +
    + if (i % 6 == 0) printf("\n\t");
    + printf("%6d,", x);
    + }
    + printf("\n};\n\n");
    +}
    +
    +void main() {
    + y = pow(0.5, 1/(double)HALFLIFE);
    +
    + calc_runnable_avg_yN_inv();
    + calc_runnable_avg_yN_sum();
    + calc_converged_max();
    + calc_accumulated_sum_32();
    +}
    --
    2.1.4
    \
     
     \ /
      Last update: 2017-02-13 06:40    [W:6.394 / U:0.132 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site