From caf6aba21918125649ff5a84fafb22e225b2d580 Mon Sep 17 00:00:00 2001 From: Fabien Chaix Date: Tue, 23 Feb 2016 10:44:15 +0200 Subject: [PATCH 1/1] Adding test for SURF concurrency feature --- src/include/surf/maxmin.h | 15 ++++++ src/surf/maxmin.cpp | 7 +++ src/surf/maxmin_private.hpp | 2 +- teshsuite/surf/maxmin_bench/maxmin_bench.c | 56 ++++++++++++++++++---- 4 files changed, 71 insertions(+), 9 deletions(-) diff --git a/src/include/surf/maxmin.h b/src/include/surf/maxmin.h index 6fbb863b75..27885bfeb7 100644 --- a/src/include/surf/maxmin.h +++ b/src/include/surf/maxmin.h @@ -217,7 +217,15 @@ XBT_PUBLIC(double) lmm_constraint_get_usage(lmm_constraint_t cnst); */ XBT_PUBLIC(void) lmm_constraint_concurrency_limit_set(lmm_constraint_t cnst, int concurrency_limit); +/** + * @brief Gets the concurrency limit for this constraint + * + * @param cnst A constraint + * @return The concurrency limit used by this constraint + */ +XBT_PUBLIC(int) lmm_constraint_concurrency_limit_get(lmm_constraint_t cnst); + /** * @brief Reset the concurrency maximum for a given variable (we will update the maximum to reflect constraint evolution). * @@ -474,6 +482,13 @@ XBT_PUBLIC(void) lmm_update_constraint_bound(lmm_system_t sys, */ XBT_PUBLIC(int) lmm_constraint_used(lmm_system_t sys, lmm_constraint_t cnst); +/** + * @brief Print the lmm system + * + * @param sys The lmm system to print + */ +XBT_PUBLIC(void) lmm_print(lmm_system_t sys); + /** * @brief Solve the lmm system * diff --git a/src/surf/maxmin.cpp b/src/surf/maxmin.cpp index 70e6c568e2..6a98bd9301 100644 --- a/src/surf/maxmin.cpp +++ b/src/surf/maxmin.cpp @@ -190,8 +190,14 @@ lmm_constraint_t lmm_constraint_new(lmm_system_t sys, void *id, return cnst; } +int lmm_constraint_concurrency_limit_get(lmm_constraint_t cnst) +{ + return cnst->concurrency_limit; +} + void lmm_constraint_concurrency_limit_set(lmm_constraint_t cnst, int concurrency_limit) { + xbt_assert(concurrency_limit<0 || cnst->concurrency_maximum<=concurrency_limit,"New concurrency limit should be larger than observed concurrency maximum. Maybe you want to call lmm_constraint_concurrency_maximum_reset() to reset the maximum?"); cnst->concurrency_limit = concurrency_limit; } @@ -202,6 +208,7 @@ void lmm_constraint_concurrency_maximum_reset(lmm_constraint_t cnst) int lmm_constraint_concurrency_maximum_get(lmm_constraint_t cnst) { + xbt_assert(cnst->concurrency_limit<0 || cnst->concurrency_maximum<=cnst->concurrency_limit,"Very bad: maximum observed concurrency is higher than limit. This is a bug of SURF, please report it."); return cnst->concurrency_maximum; } diff --git a/src/surf/maxmin_private.hpp b/src/surf/maxmin_private.hpp index 9de4a8a5c6..d3ebfc3286 100644 --- a/src/surf/maxmin_private.hpp +++ b/src/surf/maxmin_private.hpp @@ -141,7 +141,7 @@ typedef struct lmm_system { * * @param sys A lmm system */ -XBT_PRIVATE void lmm_print(lmm_system_t sys); +//XBT_PRIVATE void lmm_print(lmm_system_t sys); extern XBT_PRIVATE double (*func_f_def) (lmm_variable_t, double); extern XBT_PRIVATE double (*func_fp_def) (lmm_variable_t, double); diff --git a/teshsuite/surf/maxmin_bench/maxmin_bench.c b/teshsuite/surf/maxmin_bench/maxmin_bench.c index 35aa2e8a8d..314fd41acf 100644 --- a/teshsuite/surf/maxmin_bench/maxmin_bench.c +++ b/teshsuite/surf/maxmin_bench/maxmin_bench.c @@ -28,23 +28,34 @@ int int_random(int max) return (int) (((max * 1.0) * rand()) / (RAND_MAX + 1.0)); } -void test(int nb_cnst, int nb_var, int nb_elem); -void test(int nb_cnst, int nb_var, int nb_elem) +void test(int nb_cnst, int nb_var, int nb_elem, int pw_base_limit, int pw_max_limit, float rate_no_limit, int max_share); +void test(int nb_cnst, int nb_var, int nb_elem, int pw_base_limit, int pw_max_limit, float rate_no_limit, int max_share) { lmm_system_t Sys = NULL; lmm_constraint_t *cnst = xbt_new0(lmm_constraint_t, nb_cnst); lmm_variable_t *var = xbt_new0(lmm_variable_t, nb_var); int *used = xbt_new0(int, nb_cnst); - int i, j, k; - + int i, j, k,l; + Sys = lmm_system_new(1); for (i = 0; i < nb_cnst; i++) { cnst[i] = lmm_constraint_new(Sys, NULL, float_random(10.0)); + if(rate_no_limit>float_random(1.0)) + //Look at what happens when there is no concurrency limit + l=-1; + else + //Badly logarithmically random concurrency limit in [2^pw_base_limit+1,2^pw_base_limit+2^pw_max_limit] + l=(1<l) + l=j; + printf("(%i):%i/%i ",i,j,k); + lmm_constraint_concurrency_maximum_reset(cnst[i]); + xbt_assert(!lmm_constraint_concurrency_maximum_get(cnst[i])); + if(i%10==9) + printf("\n"); + } + printf("\nTotal maximum concurrency is %i\n",l); + + lmm_print(Sys); + for (i = 0; i < nb_var; i++) lmm_variable_free(Sys, var[i]); lmm_system_free(Sys); free(cnst); free(var); free(used); + } int main(int argc, char **argv) { int nb_cnst = 2000; int nb_var = 2000; - int nb_elem = 80; + int nb_elem; + int pw_base_limit=5; + int pw_max_limit=8; + float rate_no_limit=0.2; + int max_share=1<<(pw_base_limit/2+1); + + //If you want to test concurrency, you need nb_elem >> 2^pw_base_limit: + nb_elem= (1<