Hi Gilles,
On Wed, 2008-10-22 at 13:51 +0200, Gilles Carry wrote:
> Dimension (128) of statistics arrays must be a multiple of number of cpu.
> This is a hassle as you have to recompile every time your arch changes
> or if you want to disable cpus.
> Failing to do so causes segfault when requiring statistics if
> 128 modulo nr_cpus != 0
>
> This patch adds option -i to specify how many iterations are wanted
> (still defaulting to 128).
> It rounds up iterations to the nearest multiple of online cpus.
>
> Signed-off-by: Gilles Carry <[EMAIL PROTECTED]>
I played around with this some. Overall, I think it's good stuff. It
is fairly nonsensical to specify 0 iterations, but it's also not very
hard to handle, either... may just want to be a little more graceful
about it? Dunno... rather minor in my book. Thanks for doing this!
# ./matrix_mult -i0
---------------------------------------
Matrix Multiplication (SMP Performance)
---------------------------------------
Running 0 iterations
Matrix Dimensions: 100x100
Calculations per iteration: 8
Number of CPUs: 4
jvmsim disabled
Running sequential operations
Floating point exception
Tested-by: Timothy R. Chavez <[EMAIL PROTECTED]>
Acked-by: Timothy R. Chavez <[EMAIL PROTECTED]>
> ---
> testcases/realtime/func/matrix_mult/matrix_mult.c | 39 +++++++++++++++-----
> 1 files changed, 29 insertions(+), 10 deletions(-)
>
> diff --git a/testcases/realtime/func/matrix_mult/matrix_mult.c
> b/testcases/realtime/func/matrix_mult/matrix_mult.c
> index a551687..5cdb0dc 100644
> --- a/testcases/realtime/func/matrix_mult/matrix_mult.c
> +++ b/testcases/realtime/func/matrix_mult/matrix_mult.c
> @@ -51,7 +51,7 @@
> /* (and therefore SMP performance goes
> up) */
> #define PASS_CRITERIA 0.75 /* Avg concurrent time * pass
> criteria < avg seq time - */
> /* for every addition of a cpu */
> -#define ITERATIONS 128 /* HAS to be a multiple of 'numcpus' */
> +#define ITERATIONS 128
> #define HIST_BUCKETS 100
>
> #define THREAD_WAIT 1
> @@ -68,6 +68,7 @@ static int *mult_index;
> static int *tids;
> static int *flags;
> static int online_cpu_id = -1;
> +static int iterations = ITERATIONS;
>
> stats_container_t sdat, cdat, *curdat;
> stats_container_t shist, chist;
> @@ -81,6 +82,7 @@ void usage(void)
> printf("matrix_mult specific options:\n");
> printf(" -j enable jvmsim\n");
> printf(" -l# #: number of multiplications per iteration
> (load)\n");
> + printf(" -i# #: number of iterations\n");
> }
>
> int parse_args(int c, char *v)
> @@ -90,6 +92,9 @@ int parse_args(int c, char *v)
> case 'j':
> run_jvmsim = 1;
> break;
> + case 'i':
> + iterations = atoi(v);
> + break;
> case 'l':
> ops = atoi(v);
> break;
> @@ -234,9 +239,9 @@ void main_thread(void)
> float savg, cavg;
> int cpuid;
>
> - if ( stats_container_init(&sdat, ITERATIONS) ||
> + if ( stats_container_init(&sdat, iterations) ||
> stats_container_init(&shist, HIST_BUCKETS) ||
> - stats_container_init(&cdat, ITERATIONS/numcpus) ||
> + stats_container_init(&cdat, iterations/numcpus) ||
> stats_container_init(&chist, HIST_BUCKETS)
> )
> {
> @@ -279,12 +284,12 @@ void main_thread(void)
> curdat = &sdat;
> printf("\nRunning sequential operations\n");
> start = rt_gettime();
> - for (i = 0; i < ITERATIONS; i++)
> + for (i = 0; i < iterations; i++)
> matrix_mult_record(MATRIX_SIZE, i);
> end = rt_gettime();
> delta = (long)((end - start)/NS_PER_US);
>
> - savg = delta/ITERATIONS; /* don't use the stats record, use the total
> time recorded */
> + savg = delta/iterations; /* don't use the stats record, use the total
> time recorded */
> smin = stats_min(&sdat);
> smax = stats_max(&sdat);
>
> @@ -317,9 +322,9 @@ void main_thread(void)
>
> /* run matrix mult operation concurrently */
> curdat = &cdat;
> - printf("\nRunning concurrent operations (%dx)\n", ITERATIONS);
> + printf("\nRunning concurrent operations (%dx)\n", iterations);
> start = rt_gettime();
> - for (i = 0; i < ITERATIONS; i++)
> + for (i = 0; i < iterations; i++)
> concurrent_ops();
> end = rt_gettime();
> delta = (long)((end - start)/NS_PER_US);
> @@ -334,7 +339,7 @@ void main_thread(void)
> pthread_mutex_unlock(&t->mutex);
> }
>
> - cavg = delta/ITERATIONS; /* don't use the stats record, use the total
> time recorded */
> + cavg = delta/iterations; /* don't use the stats record, use the total
> time recorded */
> cmin = stats_min(&cdat);
> cmax = stats_max(&cdat);
>
> @@ -373,15 +378,29 @@ int main(int argc, char *argv[])
> {
> setup();
> pass_criteria = PASS_CRITERIA;
> - rt_init("jl:h", parse_args, argc, argv);
> + rt_init("jl:i:h", parse_args, argc, argv);
> numcpus = sysconf(_SC_NPROCESSORS_ONLN);
> /* the minimum avg concurrent multiplier to pass */
> criteria = pass_criteria * numcpus;
> + int new_iterations;
>
> printf("\n---------------------------------------\n");
> printf("Matrix Multiplication (SMP Performance)\n");
> printf("---------------------------------------\n\n");
> - printf("Running %d iterations\n", ITERATIONS);
> +
> + /* Line below rounds up iterations to a multiple
> + * of numcpus.
> + * Without this, having iterations not a mutiple
> + * of numcpus causes stats to segfault (overflow
> + * stats array).
> + */
> + new_iterations = (int) ( (iterations + numcpus - 1) / numcpus) *
> numcpus;
> + if (new_iterations != iterations)
> + printf("Rounding up iterations value to nearest multiple of
> total online CPUs\n");
> +
> + iterations = new_iterations;
> +
> + printf("Running %d iterations\n", iterations);
> printf("Matrix Dimensions: %dx%d\n", MATRIX_SIZE, MATRIX_SIZE);
> printf("Calculations per iteration: %d\n", ops);
> printf("Number of CPUs: %u\n", numcpus);
--
-tim
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list