Hi Gilles,

On Wed, 2008-10-22 at 13:51 +0200, Gilles Carry wrote:
> In concurrent calculations:
> - use a single pthread_barrier to start all threads together instead
> of a combination of barrier/mutex/condvar.
> - main thread no longer participates to concurrent calculations and simply
> performs rt_gettime(s) for global time spent evaluation.
> 
> Signed-off-by: Gilles Carry <[EMAIL PROTECTED]>

I'll Darren peer review the functional changes to this test, but I
thought I might comment on the following...

> ---
>  testcases/realtime/func/matrix_mult/matrix_mult.c |   79 
> ++++-----------------
>  1 files changed, 14 insertions(+), 65 deletions(-)
> 
> diff --git a/testcases/realtime/func/matrix_mult/matrix_mult.c 
> b/testcases/realtime/func/matrix_mult/matrix_mult.c
> index 5cdb0dc..78f3d46 100644
> --- a/testcases/realtime/func/matrix_mult/matrix_mult.c
> +++ b/testcases/realtime/func/matrix_mult/matrix_mult.c
> @@ -66,9 +66,9 @@ static int numcpus;
>  static float criteria;
>  static int *mult_index;
>  static int *tids;
> -static int *flags;
>  static int online_cpu_id = -1;
>  static int iterations = ITERATIONS;
> +static int iterations_percpu;

This belongs in patch 4, no?

> 
>  stats_container_t sdat, cdat, *curdat;
>  stats_container_t shist, chist;
> @@ -178,6 +178,7 @@ void *concurrent_thread(void *thread)
>       struct thread *t = (struct thread *)thread;
>       int thread_id = (intptr_t)t->arg;
>       int cpuid;
> +     int i;
> 
>       cpuid = set_affinity();
>       if (cpuid == -1) {
> @@ -189,47 +190,12 @@ void *concurrent_thread(void *thread)
>       }
> 
>       pthread_barrier_wait(&mult_start);
> -     while (flags[thread_id] != THREAD_DONE) {
> -             pthread_mutex_lock(&t->mutex);
> -             flags[thread_id] = THREAD_WAIT;
> -             do {
> -                     if (pthread_cond_wait(&t->cond, &t->mutex) != 0) {
> -                             printf("cond_wait error!");
> -                             exit(1);
> -                     }
> -             } while (flags[thread_id] == THREAD_WAIT);
> -             pthread_mutex_unlock(&t->mutex);
> -             if (flags[thread_id] == THREAD_WORK)
> -                     matrix_mult_record(MATRIX_SIZE, 
> mult_index[thread_id]++);
> -     }
> +     for (i=0; i < iterations_percpu; i++)
> +             matrix_mult_record(MATRIX_SIZE, mult_index[thread_id]++);

As it stands, iterations_percpu is uninitialized until you apply the
forth patch, so you will be unable to confirm your results with the
functional changes you've made with patch three without applying patch
four, right?

>       return NULL;
>  }
> 
> -void concurrent_ops(void)
> -{
> -     static int thread_id = 0;
> -
> -     if (thread_id < (numcpus-1)) {
> -             struct timespec nsleep;
> -             struct thread *t;
> -
> -             while (flags[thread_id] != THREAD_WAIT) {
> -                     nsleep.tv_sec = 0;
> -                     nsleep.tv_nsec = THREAD_SLEEP;
> -                     nanosleep(&nsleep, NULL);
> -             }
> -             t = get_thread(tids[thread_id]);
> -             pthread_mutex_lock(&t->mutex);
> -             flags[thread_id] = THREAD_WORK;
> -             pthread_cond_signal(&t->cond);
> -             pthread_mutex_unlock(&t->mutex);
> -     } else
> -             matrix_mult_record(MATRIX_SIZE, mult_index[thread_id]++);
> -
> -     if (++thread_id == numcpus)
> -             thread_id = 0;
> -}
> 
>  void main_thread(void)
>  {
> @@ -241,7 +207,7 @@ void main_thread(void)
> 
>       if (    stats_container_init(&sdat, iterations) ||
>               stats_container_init(&shist, HIST_BUCKETS) ||
> -             stats_container_init(&cdat, iterations/numcpus) ||
> +             stats_container_init(&cdat, iterations_percpu) ||

As stated, using an uninitialized value...

>               stats_container_init(&chist, HIST_BUCKETS)
>       )
>       {
> @@ -249,8 +215,6 @@ void main_thread(void)
>               exit(1);
>       }
> 
> -     pthread_barrier_init(&mult_start, NULL, numcpus);
> -
>       mult_index = malloc(sizeof(int) * numcpus);
>       if (!mult_index) {
>               perror("malloc");
> @@ -263,12 +227,6 @@ void main_thread(void)
>               exit(1);
>       }
>       memset(tids, 0, numcpus);
> -     flags = malloc(sizeof(int) * numcpus);
> -     if (!flags) {
> -             perror("malloc");
> -             exit(1);
> -     }
> -     memset(flags, 0, numcpus);
> 
>       cpuid = set_affinity();
>       if (cpuid == -1) {
> @@ -309,35 +267,27 @@ void main_thread(void)
>               fprintf(stderr, "Warning: could not save sequential mults 
> stats\n");
>       }
> 
> +     pthread_barrier_init(&mult_start, NULL, numcpus+1);
> +     set_priority(PRIO);
> +     curdat = &cdat;
> +     online_cpu_id = -1; /* Redispatch cpus */
>       /* Create numcpus-1 concurrent threads */
> -     for (j = 0; j < (numcpus-1); j++) {
> +     for (j = 0; j < numcpus; j++) {
>               tids[j] = create_fifo_thread(concurrent_thread, (void 
> *)(intptr_t)j, PRIO);
>               if (tids[j] == -1) {
>                       printf("Thread creation failed (max threads 
> exceeded?)\n");
> -                     break;
> +                     exit(1);
>               }
>       }
> 
> -     pthread_barrier_wait(&mult_start);
> 
>       /* run matrix mult operation concurrently */
> -     curdat = &cdat;
> -     printf("\nRunning concurrent operations (%dx)\n", iterations);
> +     pthread_barrier_wait(&mult_start);
>       start = rt_gettime();
> -     for (i = 0; i < iterations; i++)
> -             concurrent_ops();
> +     join_threads();
>       end = rt_gettime();
> -     delta = (long)((end - start)/NS_PER_US);
> -
> -     for (j = 0; j < (numcpus-1); j++) {
> -             struct thread *t;
> 
> -             t = get_thread(tids[j]);
> -             pthread_mutex_lock(&t->mutex);
> -             flags[j] = THREAD_DONE;
> -             pthread_cond_signal(&t->cond);
> -             pthread_mutex_unlock(&t->mutex);
> -     }
> +     delta = (long)((end - start)/NS_PER_US);
> 
>       cavg = delta/iterations; /* don't use the stats record, use the total 
> time recorded */
>       cmin = stats_min(&cdat);
> @@ -415,7 +365,6 @@ int main(int argc, char *argv[])
>       set_priority(PRIO);
>       main_thread();
> 
> -     join_threads();
> 
>       return 0;
>  }
-- 
-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

Reply via email to