Browse Source

non-linear regression: use trichotomy

which is more robust than dichotomy that assumes a quite strong
concavity.
Samuel Thibault 4 years ago
parent
commit
c22b3552bf
1 changed files with 16 additions and 7 deletions
  1. 16 7
      src/core/perfmodel/regression.c

+ 16 - 7
src/core/perfmodel/regression.c

@@ -226,17 +226,23 @@ int _starpu_regression_non_linear_power(struct starpu_perfmodel_history_list *pt
 
 	double err = 100000.0;
 
+/*
+	unsigned i;
+	for (i = 0; i < 100; i++)
+	{
+		double ci = cmin + (cmax-cmin)*i/100.;
+		fprintf(stderr,"%f: %f\n", ci, 1.0 - test_r(ci, n, x, y, pop));
+	}
+*/
+
 	/* Use dichotomy to find c that gives the best matching */
 	for (iter = 0; iter < MAXREGITER; iter++)
 	{
-		//fprintf(stderr,"%f - %f\n", cmin, cmax);
 		double c1, c2;
 		double r1, r2;
 
-		double radius = 0.01;
-
-		c1 = cmin + (0.5-radius)*(cmax - cmin);
-		c2 = cmin + (0.5+radius)*(cmax - cmin);
+		c1 = cmin + (0.33)*(cmax - cmin);
+		c2 = cmin + (0.67)*(cmax - cmin);
 
 		r1 = test_r(c1, n, x, y, pop);
 		r2 = test_r(c2, n, x, y, pop);
@@ -245,14 +251,17 @@ int _starpu_regression_non_linear_power(struct starpu_perfmodel_history_list *pt
 		err1 = fabs(1.0 - r1);
 		err2 = fabs(1.0 - r2);
 
+		//fprintf(stderr,"%f - %f: %f - %f: %f - %f\n", cmin, c1, err1, c2, err2, cmax);
+
 		if (err1 < err2)
 		{
-			cmax = (cmin + cmax)/2;
+			/* 1 is better */
+			cmax = c2;
 		}
 		else
 		{
 			/* 2 is better */
-			cmin = (cmin + cmax)/2;
+			cmin = c1;
 		}
 
 		if (fabs(err - STARPU_MIN(err1, err2)) < EPS)