diff options
author | Ingo Molnar <mingo@elte.hu> | 2007-08-09 05:16:51 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2007-08-09 05:16:51 -0400 |
commit | 254753dc321ea2b753ca9bc58ac329557a20efac (patch) | |
tree | 57abb3eeaad1f9c9cc258975bef92567f5a01253 /kernel | |
parent | 6e82a3befe91423e501c2124312bd805be0048eb (diff) |
sched: make the multiplication table more accurate
do small deltas in the weight and multiplication constant table so
that the worst-case numeric error is better than 1:100000000. (8 digits)
the current error table is:
nice mult * inv_mult error
------------------------------------------
-20: 88761 * 48388 -0.0000000065
-19: 71755 * 59856 -0.0000000037
-18: 56483 * 76040 0.0000000056
-17: 46273 * 92818 0.0000000042
-16: 36291 * 118348 -0.0000000065
-15: 29154 * 147320 -0.0000000037
-14: 23254 * 184698 -0.0000000009
-13: 18705 * 229616 -0.0000000037
-12: 14949 * 287308 -0.0000000009
-11: 11916 * 360437 -0.0000000009
-10: 9548 * 449829 -0.0000000009
-9: 7620 * 563644 -0.0000000037
-8: 6100 * 704093 0.0000000009
-7: 4904 * 875809 0.0000000093
-6: 3906 * 1099582 -0.0000000009
-5: 3121 * 1376151 -0.0000000058
-4: 2501 * 1717300 0.0000000009
-3: 1991 * 2157191 -0.0000000035
-2: 1586 * 2708050 0.0000000009
-1: 1277 * 3363326 0.0000000014
0: 1024 * 4194304 0.0000000000
1: 820 * 5237765 0.0000000009
2: 655 * 6557202 0.0000000033
3: 526 * 8165337 -0.0000000079
4: 423 * 10153587 0.0000000012
5: 335 * 12820798 0.0000000079
6: 272 * 15790321 0.0000000037
7: 215 * 19976592 -0.0000000037
8: 172 * 24970740 -0.0000000037
9: 137 * 31350126 -0.0000000079
10: 110 * 39045157 -0.0000000061
11: 87 * 49367440 -0.0000000037
12: 70 * 61356676 0.0000000056
13: 56 * 76695844 -0.0000000075
14: 45 * 95443717 -0.0000000072
15: 36 * 119304647 -0.0000000009
16: 29 * 148102320 -0.0000000037
17: 23 * 186737708 -0.0000000028
18: 18 * 238609294 -0.0000000009
19: 15 * 286331153 -0.0000000002
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/sched.c | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index afc59f274e58..5470ab0258a8 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -704,11 +704,14 @@ static void update_load_sub(struct load_weight *lw, unsigned long dec) | |||
704 | * the relative distance between them is ~25%.) | 704 | * the relative distance between them is ~25%.) |
705 | */ | 705 | */ |
706 | static const int prio_to_weight[40] = { | 706 | static const int prio_to_weight[40] = { |
707 | /* -20 */ 88818, 71054, 56843, 45475, 36380, 29104, 23283, 18626, 14901, 11921, | 707 | /* -20 */ 88761, 71755, 56483, 46273, 36291, |
708 | /* -10 */ 9537, 7629, 6103, 4883, 3906, 3125, 2500, 2000, 1600, 1280, | 708 | /* -15 */ 29154, 23254, 18705, 14949, 11916, |
709 | /* 0 */ NICE_0_LOAD /* 1024 */, | 709 | /* -10 */ 9548, 7620, 6100, 4904, 3906, |
710 | /* 1 */ 819, 655, 524, 419, 336, 268, 215, 172, 137, | 710 | /* -5 */ 3121, 2501, 1991, 1586, 1277, |
711 | /* 10 */ 110, 87, 70, 56, 45, 36, 29, 23, 18, 15, | 711 | /* 0 */ 1024, 820, 655, 526, 423, |
712 | /* 5 */ 335, 272, 215, 172, 137, | ||
713 | /* 10 */ 110, 87, 70, 56, 45, | ||
714 | /* 15 */ 36, 29, 23, 18, 15, | ||
712 | }; | 715 | }; |
713 | 716 | ||
714 | /* | 717 | /* |
@@ -719,14 +722,14 @@ static const int prio_to_weight[40] = { | |||
719 | * into multiplications: | 722 | * into multiplications: |
720 | */ | 723 | */ |
721 | static const u32 prio_to_wmult[40] = { | 724 | static const u32 prio_to_wmult[40] = { |
722 | /* -20 */ 48356, 60446, 75558, 94446, 118058, | 725 | /* -20 */ 48388, 59856, 76040, 92818, 118348, |
723 | /* -15 */ 147573, 184467, 230589, 288233, 360285, | 726 | /* -15 */ 147320, 184698, 229616, 287308, 360437, |
724 | /* -10 */ 450347, 562979, 703746, 879575, 1099582, | 727 | /* -10 */ 449829, 563644, 704093, 875809, 1099582, |
725 | /* -5 */ 1374389, 1717986, 2147483, 2684354, 3355443, | 728 | /* -5 */ 1376151, 1717300, 2157191, 2708050, 3363326, |
726 | /* 0 */ 4194304, 5244160, 6557201, 8196502, 10250518, | 729 | /* 0 */ 4194304, 5237765, 6557202, 8165337, 10153587, |
727 | /* 5 */ 12782640, 16025997, 19976592, 24970740, 31350126, | 730 | /* 5 */ 12820798, 15790321, 19976592, 24970740, 31350126, |
728 | /* 10 */ 39045157, 49367440, 61356675, 76695844, 95443717, | 731 | /* 10 */ 39045157, 49367440, 61356676, 76695844, 95443717, |
729 | /* 15 */ 119304647, 148102320, 186737708, 238609294, 286331153, | 732 | /* 15 */ 119304647, 148102320, 186737708, 238609294, 286331153, |
730 | }; | 733 | }; |
731 | 734 | ||
732 | static void activate_task(struct rq *rq, struct task_struct *p, int wakeup); | 735 | static void activate_task(struct rq *rq, struct task_struct *p, int wakeup); |