X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f4895c3c3d812abc5ae8cce1d75580f7ed4bbf4f..c65262b0c284780b8499ffe9a55cd3cc2ca4a4a6:/teshsuite/surf/maxmin_bench/maxmin_bench.c diff --git a/teshsuite/surf/maxmin_bench/maxmin_bench.c b/teshsuite/surf/maxmin_bench/maxmin_bench.c index 8e7d2b0fad..cc1698f067 100644 --- a/teshsuite/surf/maxmin_bench/maxmin_bench.c +++ b/teshsuite/surf/maxmin_bench/maxmin_bench.c @@ -1,73 +1,109 @@ /* A crash few tests for the maxmin library */ -/* Copyright (c) 2004-2014. The SimGrid Team. +/* Copyright (c) 2004-2015. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -#ifdef __BORLANDC__ -#pragma hdrstop -#endif - - #include "surf/maxmin.h" #include "xbt/module.h" #include "xbt/xbt_os_time.h" #include "xbt/sysdep.h" /* time manipulation for benchmarking */ +#define MYRANDMAX 1000 + #include #include +#include double date; +int64_t seedx= 0; -double float_random(double max); -double float_random(double max) +static int myrand(void) { + seedx=seedx * 16807 % 2147483647; + return (int32_t) seedx%1000; +} + +static double float_random(double max) { - return ((max * rand()) / (RAND_MAX + 1.0)); + return ((max * myrand()) / (MYRANDMAX + 1.0)); } -int int_random(int max); -int int_random(int max) +static int int_random(int max) { - return (int) (((max * 1.0) * rand()) / (RAND_MAX + 1.0)); + return (int32_t) (((max * 1.0) * myrand()) / (MYRANDMAX + 1.0)); } -void test(int nb_cnst, int nb_var, int nb_elem); -void test(int nb_cnst, int nb_var, int nb_elem) +static 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, int mode) { 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; + int concurrency_share; 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<=concurrency_share) { j--; continue; } - lmm_expand(Sys, cnst[k], var[i], float_random(1.0)); - used[k] = 1; + lmm_expand(Sys, cnst[k], var[i], float_random(1.5)); + lmm_expand_add(Sys, cnst[k], var[i], float_random(1.5)); + used[k]++; } } - printf("Starting to solve\n"); + printf("Starting to solve(%i)\n",myrand()%1000); date = xbt_os_time() * 1000000; lmm_solve(Sys); date = xbt_os_time() * 1000000 - date; + if(mode==2){ + printf("Max concurrency:\n"); + l=0; + for (i = 0; i < nb_cnst; i++) { + j=lmm_constraint_concurrency_maximum_get(cnst[i]); + k=lmm_constraint_concurrency_limit_get(cnst[i]); + xbt_assert(k<0 || j<=k); + if(j>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); @@ -76,21 +112,89 @@ void test(int nb_cnst, int nb_var, int nb_elem) free(used); } -#ifdef __BORLANDC__ -#pragma argsused -#endif - +int TestClasses [][4]= + //Nbcnst Nbvar Baselimit Maxlimit + {{ 10 ,10 ,1 ,2 }, //small + { 100 ,100 ,3 ,6 }, //medium + { 2000,2000 ,5 ,8 }, //big + { 20000,20000 ,7 ,10} //huge + }; int main(int argc, char **argv) { - int nb_cnst = 2000; - int nb_var = 2000; - int nb_elem = 80; + int nb_cnst, nb_var,nb_elem,pw_base_limit,pw_max_limit,max_share; + float rate_no_limit=0.2; + float acc_date=0,acc_date2=0; + int testclass,mode,testcount; + int i; + + if(argc<3) { + fprintf(stderr, "Syntax: [test|debug|perf]\n"); + return -1; + } + + //what class? + if(!strcmp(argv[1],"small")) + testclass=0; + else if(!strcmp(argv[1],"medium")) + testclass=1; + else if(!strcmp(argv[1],"big")) + testclass=2; + else if(!strcmp(argv[1],"huge")) + testclass=3; + else { + fprintf(stderr, "Unknown class \"%s\", aborting!\n",argv[1]); + return -2; + } + + //How many times? + testcount=atoi(argv[2]); + + //Show me everything (debug or performance)! + mode=0; + if(argc>=4 && strcmp(argv[3],"test")==0) + mode=1; + if(argc>=4 && strcmp(argv[3],"debug")==0) + mode=2; + if(argc>=4 && strcmp(argv[3],"perf")==0) + mode=3; + + if(mode==1) + xbt_log_control_set("surf/maxmin.threshold:DEBUG surf/maxmin.fmt:\'[%r]: [%c/%p] %m%n\'\ + surf.threshold:DEBUG surf.fmt:\'[%r]: [%c/%p] %m%n\' "); + + if(mode==2) + xbt_log_control_set("surf/maxmin.threshold:DEBUG surf.threshold:DEBUG"); + + nb_cnst= TestClasses[testclass][0]; + nb_var= TestClasses[testclass][1]; + pw_base_limit= TestClasses[testclass][2]; + pw_max_limit= TestClasses[testclass][3]; + max_share=2; //1<<(pw_base_limit/2+1); + + //If you want to test concurrency, you need nb_elem >> 2^pw_base_limit: + nb_elem= (1<