Selaa lähdekoodia

Fix a calibration issue when the machine is cold, by adding a deviation limit during calibration.

Marc Sergent 11 vuotta sitten
vanhempi
commit
483f218e85
2 muutettua tiedostoa jossa 32 lisäystä ja 6 poistoa
  1. 1 0
      include/starpu_perfmodel.h
  2. 31 6
      src/core/perfmodel/perfmodel_history.c

+ 1 - 0
include/starpu_perfmodel.h

@@ -49,6 +49,7 @@ struct starpu_perfmodel_history_entry
 	double sum;
 	double sum2;
 	unsigned nsample;
+	unsigned nerror;
 	uint32_t footprint;
 #ifdef STARPU_HAVE_WINDOWS
 	unsigned size;

+ 31 - 6
src/core/perfmodel/perfmodel_history.c

@@ -35,6 +35,8 @@
 #include <windows.h>
 #endif
 
+/* TODO: Replace the define by a configure parameter ?*/
+#define HISTORYMAXERROR 0.1
 #define HASH_ADD_UINT32_T(head,field,add) HASH_ADD(hh,head,field,sizeof(uint32_t),add)
 #define HASH_FIND_UINT32_T(head,find,out) HASH_FIND(hh,head,find,sizeof(uint32_t),out)
 
@@ -1311,19 +1313,42 @@ void _starpu_update_perfmodel_history(struct _starpu_job *j, struct starpu_perfm
 
 				entry->footprint = key;
 				entry->nsample = 1;
+				entry->nerror = 0;
 
 				insert_history_entry(entry, list, &per_arch_model->history);
 			}
 			else
 			{
 				/* there is already some entry with the same footprint */
-				entry->sum += measured;
-				entry->sum2 += measured*measured;
-				entry->nsample++;
+				
+				// if (entry->nsample && (measured/entry->mean > HISTORYMAXERROR || entry->mean/measured > HISTORYMAXERROR))
+				if (entry->nsample && (measured/entry->mean < (1 - HISTORYMAXERROR) || measured/entry->mean > (1 + HISTORYMAXERROR)))
+				{
+					entry->nerror++;
+
+					/* Too much errors: we flush out all the entries */
+					if (entry->nerror >= entry->nsample)
+					{
+						entry->sum = 0.0;
+						entry->sum2 = 0.0;
+						entry->nsample = 0;
+						entry->nerror = 0;
+						entry->mean = 0.0;
+						entry->deviation = 0.0;
+						_STARPU_DEBUG("Too many errors for model %s\n", model->symbol);
+					}
+				}
+				else
+				{
+					entry->sum += measured;
+					entry->sum2 += measured*measured;
+					entry->nsample++;
+
+					unsigned n = entry->nsample;
+					entry->mean = entry->sum / n;
+					entry->deviation = sqrt((entry->sum2 - (entry->sum*entry->sum)/n)/n);
+				}
 
-				unsigned n = entry->nsample;
-				entry->mean = entry->sum / n;
-				entry->deviation = sqrt((entry->sum2 - (entry->sum*entry->sum)/n)/n);
 				if (j->task->flops != 0.)
 				{
 					if (entry->flops == 0.)