[prev in list] [next in list] [prev in thread] [next in thread]
List: ltp-list
Subject: Re: [LTP] [PATCH 3/4][RT][take#5] matrix_mult.c: thread
From: Darren Hart <dvhltc () us ! ibm ! com>
Date: 2008-10-31 21:21:18
Message-ID: 490B76CE.8060607 () us ! ibm ! com
[Download RAW message or body]
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 <gilles.carry@bull.net>
Acked-by: Darren Hart <dvhltc@us.ibm.com>
> ---
> testcases/realtime/func/matrix_mult/matrix_mult.c | 80 ++++-----------------
> 1 files changed, 15 insertions(+), 65 deletions(-)
>
> diff --git a/testcases/realtime/func/matrix_mult/matrix_mult.c \
> b/testcases/realtime/func/matrix_mult/matrix_mult.c index 1b33154..368caaf 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;
>
> 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->id;
> int cpuid;
> + int i;
>
> cpuid = set_affinity();
> if (cpuid == -1) {
> @@ -186,47 +187,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]++);
>
> 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)
> {
> @@ -238,7 +204,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) ||
> stats_container_init(&chist, HIST_BUCKETS)
> )
> {
> @@ -246,8 +212,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");
> @@ -260,12 +224,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) {
> @@ -303,35 +261,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, NULL, 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);
> @@ -396,6 +346,7 @@ int main(int argc, char *argv[])
> printf("Rounding up iterations value to nearest multiple of total online \
> CPUs\n");
> iterations = new_iterations;
> + iterations_percpu = iterations / numcpus;
>
> printf("Running %d iterations\n", iterations);
> printf("Matrix Dimensions: %dx%d\n", MATRIX_SIZE, MATRIX_SIZE);
> @@ -412,7 +363,6 @@ int main(int argc, char *argv[])
> set_priority(PRIO);
> main_thread();
>
> - join_threads();
>
> return 0;
> }
--
Darren Hart
IBM Linux Technology Center
Real-Time Linux Team
-------------------------------------------------------------------------
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
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic