ソースを参照

Move the preliminary tests out of _starpu_load_perfmodel().

Cyril Roelandt 13 年 前
コミット
ebd18b174e
共有3 個のファイルを変更した26 個の追加23 個の削除を含む
  1. 2 17
      src/core/perfmodel/perfmodel.c
  2. 1 1
      src/core/perfmodel/perfmodel.h
  3. 23 5
      src/core/perfmodel/perfmodel_history.c

+ 2 - 17
src/core/perfmodel/perfmodel.c

@@ -127,30 +127,15 @@ static double common_task_expected_perf(struct starpu_perfmodel_t *model, enum s
 	return -1.0;
 }
 
-extern pthread_rwlock_t registered_models_rwlock;
-
 void _starpu_load_perfmodel(struct starpu_perfmodel_t *model)
 {
 	if (!model || model->is_loaded)
 		return;
 
-	/* If the model has already been loaded, there is nothing to do */
-	PTHREAD_RWLOCK_RDLOCK(&registered_models_rwlock);
-	if (model->is_loaded) {
-		PTHREAD_RWLOCK_UNLOCK(&registered_models_rwlock);
-		return;
-	}
-	PTHREAD_RWLOCK_UNLOCK(&registered_models_rwlock);
+	int load_model = _starpu_register_model(model);
 
-	/* We have to make sure the model has not been loaded since the
-         * last time we took the lock */
-	PTHREAD_RWLOCK_WRLOCK(&registered_models_rwlock);
-	if (model->is_loaded) {
-		PTHREAD_RWLOCK_UNLOCK(&registered_models_rwlock);
+	if (!load_model)
 		return;
-	}
-	_starpu_register_model(model);
-	PTHREAD_RWLOCK_UNLOCK(&registered_models_rwlock);
 
 	switch (model->type) {
 		case STARPU_PER_ARCH:

+ 1 - 1
src/core/perfmodel/perfmodel.h

@@ -93,7 +93,7 @@ void _starpu_get_perf_model_dir_bus(char *path, size_t maxlen);
 void _starpu_get_perf_model_dir_debug(char *path, size_t maxlen);
 
 double _starpu_history_based_job_expected_perf(struct starpu_perfmodel_t *model, enum starpu_perf_archtype arch, struct starpu_job_s *j, unsigned nimpl);
-void _starpu_register_model(struct starpu_perfmodel_t *model);
+int _starpu_register_model(struct starpu_perfmodel_t *model);
 void _starpu_load_history_based_model(struct starpu_perfmodel_t *model, unsigned scan_history);
 void _starpu_load_perfmodel(struct starpu_perfmodel_t *model);
 void _starpu_initialize_registered_performance_models(void);

+ 23 - 5
src/core/perfmodel/perfmodel_history.c

@@ -34,7 +34,7 @@
 #include <windows.h>
 #endif
 		
-pthread_rwlock_t registered_models_rwlock;
+static pthread_rwlock_t registered_models_rwlock;
 static struct starpu_model_list_t *registered_models = NULL;
 
 /*
@@ -515,10 +515,27 @@ static void get_model_debug_path(struct starpu_perfmodel_t *model, const char *a
 	strncat(path, ".debug", maxlen);
 }
 
-/* registered_models_rwlock must be taken in write mode before calling this
- * function */
-void _starpu_register_model(struct starpu_perfmodel_t *model)
+/*
+ * Returns 0 is the model was already loaded, 1 otherwise.
+ */
+int _starpu_register_model(struct starpu_perfmodel_t *model)
 {
+	/* If the model has already been loaded, there is nothing to do */
+	PTHREAD_RWLOCK_RDLOCK(&registered_models_rwlock);
+	if (model->is_loaded) {
+		PTHREAD_RWLOCK_UNLOCK(&registered_models_rwlock);
+		return 0;
+	}
+	PTHREAD_RWLOCK_UNLOCK(&registered_models_rwlock);
+
+	/* We have to make sure the model has not been loaded since the
+         * last time we took the lock */
+	PTHREAD_RWLOCK_WRLOCK(&registered_models_rwlock);
+	if (model->is_loaded) {
+		PTHREAD_RWLOCK_UNLOCK(&registered_models_rwlock);
+		return 0;
+	}
+
 	/* add the model to a linked list */
 	struct starpu_model_list_t *node = (struct starpu_model_list_t *) malloc(sizeof(struct starpu_model_list_t));
 
@@ -545,7 +562,8 @@ void _starpu_register_model(struct starpu_perfmodel_t *model)
 	}
 #endif
 
-	return;
+	PTHREAD_RWLOCK_UNLOCK(&registered_models_rwlock);
+	return 1;
 }
 
 static void get_model_path(struct starpu_perfmodel_t *model, char *path, size_t maxlen)