xref: /openbmc/linux/Documentation/scheduler/sched-pelt.c (revision 0898782247ae533d1f4e47a06bc5d4870931b284)
176d034edSYuyang Du /*
276d034edSYuyang Du  * The following program is used to generate the constants for
376d034edSYuyang Du  * computing sched averages.
476d034edSYuyang Du  *
576d034edSYuyang Du  * ==============================================================
676d034edSYuyang Du  *		C program (compile with -lm)
776d034edSYuyang Du  * ==============================================================
876d034edSYuyang Du  */
976d034edSYuyang Du 
1076d034edSYuyang Du #include <math.h>
1176d034edSYuyang Du #include <stdio.h>
1276d034edSYuyang Du 
1376d034edSYuyang Du #define HALFLIFE 32
1476d034edSYuyang Du #define SHIFT 32
1576d034edSYuyang Du 
1676d034edSYuyang Du double y;
1776d034edSYuyang Du 
calc_runnable_avg_yN_inv(void)1876d034edSYuyang Du void calc_runnable_avg_yN_inv(void)
1976d034edSYuyang Du {
2076d034edSYuyang Du 	int i;
2176d034edSYuyang Du 	unsigned int x;
2276d034edSYuyang Du 
23*509466b7SQian Cai 	/* To silence -Wunused-but-set-variable warnings. */
24*509466b7SQian Cai 	printf("static const u32 runnable_avg_yN_inv[] __maybe_unused = {");
2576d034edSYuyang Du 	for (i = 0; i < HALFLIFE; i++) {
2676d034edSYuyang Du 		x = ((1UL<<32)-1)*pow(y, i);
2776d034edSYuyang Du 
2876d034edSYuyang Du 		if (i % 6 == 0) printf("\n\t");
2976d034edSYuyang Du 		printf("0x%8x, ", x);
3076d034edSYuyang Du 	}
3176d034edSYuyang Du 	printf("\n};\n\n");
3276d034edSYuyang Du }
3376d034edSYuyang Du 
3476d034edSYuyang Du int sum = 1024;
3576d034edSYuyang Du 
calc_runnable_avg_yN_sum(void)3676d034edSYuyang Du void calc_runnable_avg_yN_sum(void)
3776d034edSYuyang Du {
3876d034edSYuyang Du 	int i;
3976d034edSYuyang Du 
4076d034edSYuyang Du 	printf("static const u32 runnable_avg_yN_sum[] = {\n\t    0,");
4176d034edSYuyang Du 	for (i = 1; i <= HALFLIFE; i++) {
4276d034edSYuyang Du 		if (i == 1)
4376d034edSYuyang Du 			sum *= y;
4476d034edSYuyang Du 		else
4576d034edSYuyang Du 			sum = sum*y + 1024*y;
4676d034edSYuyang Du 
4776d034edSYuyang Du 		if (i % 11 == 0)
4876d034edSYuyang Du 			printf("\n\t");
4976d034edSYuyang Du 
5076d034edSYuyang Du 		printf("%5d,", sum);
5176d034edSYuyang Du 	}
5276d034edSYuyang Du 	printf("\n};\n\n");
5376d034edSYuyang Du }
5476d034edSYuyang Du 
5576d034edSYuyang Du int n = -1;
5676d034edSYuyang Du /* first period */
5776d034edSYuyang Du long max = 1024;
5876d034edSYuyang Du 
calc_converged_max(void)5976d034edSYuyang Du void calc_converged_max(void)
6076d034edSYuyang Du {
6176d034edSYuyang Du 	long last = 0, y_inv = ((1UL<<32)-1)*y;
6276d034edSYuyang Du 
6376d034edSYuyang Du 	for (; ; n++) {
6476d034edSYuyang Du 		if (n > -1)
6576d034edSYuyang Du 			max = ((max*y_inv)>>SHIFT) + 1024;
6676d034edSYuyang Du 			/*
6776d034edSYuyang Du 			 * This is the same as:
6876d034edSYuyang Du 			 * max = max*y + 1024;
6976d034edSYuyang Du 			 */
7076d034edSYuyang Du 
7176d034edSYuyang Du 		if (last == max)
7276d034edSYuyang Du 			break;
7376d034edSYuyang Du 
7476d034edSYuyang Du 		last = max;
7576d034edSYuyang Du 	}
7676d034edSYuyang Du 	n--;
7776d034edSYuyang Du 	printf("#define LOAD_AVG_PERIOD %d\n", HALFLIFE);
7876d034edSYuyang Du 	printf("#define LOAD_AVG_MAX %ld\n", max);
7976d034edSYuyang Du //	printf("#define LOAD_AVG_MAX_N %d\n\n", n);
8076d034edSYuyang Du }
8176d034edSYuyang Du 
calc_accumulated_sum_32(void)8276d034edSYuyang Du void calc_accumulated_sum_32(void)
8376d034edSYuyang Du {
8476d034edSYuyang Du 	int i, x = sum;
8576d034edSYuyang Du 
8676d034edSYuyang Du 	printf("static const u32 __accumulated_sum_N32[] = {\n\t     0,");
8776d034edSYuyang Du 	for (i = 1; i <= n/HALFLIFE+1; i++) {
8876d034edSYuyang Du 		if (i > 1)
8976d034edSYuyang Du 			x = x/2 + sum;
9076d034edSYuyang Du 
9176d034edSYuyang Du 		if (i % 6 == 0)
9276d034edSYuyang Du 			printf("\n\t");
9376d034edSYuyang Du 
9476d034edSYuyang Du 		printf("%6d,", x);
9576d034edSYuyang Du 	}
9676d034edSYuyang Du 	printf("\n};\n\n");
9776d034edSYuyang Du }
9876d034edSYuyang Du 
main(void)9976d034edSYuyang Du void main(void)
10076d034edSYuyang Du {
10176d034edSYuyang Du 	printf("/* Generated by Documentation/scheduler/sched-pelt; do not modify. */\n\n");
10276d034edSYuyang Du 
10376d034edSYuyang Du 	y = pow(0.5, 1/(double)HALFLIFE);
10476d034edSYuyang Du 
10576d034edSYuyang Du 	calc_runnable_avg_yN_inv();
10676d034edSYuyang Du //	calc_runnable_avg_yN_sum();
10776d034edSYuyang Du 	calc_converged_max();
10876d034edSYuyang Du //	calc_accumulated_sum_32();
10976d034edSYuyang Du }
110