mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
2.0 KiB
109 lines
2.0 KiB
/* |
|
* 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(void) |
|
{ |
|
int i; |
|
unsigned int x; |
|
|
|
/* To silence -Wunused-but-set-variable warnings. */ |
|
printf("static const u32 runnable_avg_yN_inv[] __maybe_unused = {"); |
|
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(void) |
|
{ |
|
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(void) |
|
{ |
|
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(void) |
|
{ |
|
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(void) |
|
{ |
|
printf("/* Generated by Documentation/scheduler/sched-pelt; do not modify. */\n\n"); |
|
|
|
y = pow(0.5, 1/(double)HALFLIFE); |
|
|
|
calc_runnable_avg_yN_inv(); |
|
// calc_runnable_avg_yN_sum(); |
|
calc_converged_max(); |
|
// calc_accumulated_sum_32(); |
|
}
|
|
|