source: CIVL/examples/pthread/bug6fix.cvl@ 761eb6f

1.23 2.0 main test-branch
Last change on this file since 761eb6f was 761eb6f, checked in by John Edenhofner <johneden@…>, 12 years ago

Updated examples and Makefile

git-svn-id: svn://vsl.cis.udel.edu/civl/trunk@1029 fb995dde-84ed-4084-dfe6-e5aef3e2452c

  • Property mode set to 100644
File size: 2.7 KB
Line 
1/*****************************************************************************
2* SOURCE: This is a translation of a Pthread program from the Lawrence Livermore
3* Computing Center POSIX Threads Programming Exercise at:
4* https://computing.llnl.gov/tutorials/pthreads/exercise.html
5* FILE: bug6fix.cvl
6* DESCRIPTION:
7* This solution uses a mutex variable to protect the global sum while each
8* thread updates it. A much more efficient method would be that used in the
9* dotprod_mutex.cvl example.
10* Command line execution:
11* civl verify -inputNUMTHRDS=8 -inputVECLEN=100000 bug6fix.cvl
12******************************************************************************/
13
14#include <pthread.h>
15#include <stdio.h>
16#include <stdlib.h>
17
18/* Define global data where everyone can see them */
19$input int NUMTHRDS;
20$input int VECLEN;
21pthread_mutex_t mutexsum;
22int *a, *b;
23long sum=0.0;
24
25void *dotprod(void *arg)
26{
27 /* Each thread works on a different set of data.
28 * The offset is specified by the arg parameter. The size of
29 * the data for each thread is indicated by VECLEN.
30 */
31 int i, start, end, offset, len;
32 long tid;
33 tid = (long)*arg;
34 offset = tid;
35 len = VECLEN;
36 start = offset*len;
37 end = start + len;
38
39/* Perform my section of the dot product */
40 printf("thread: %d starting. start=%d end=%d\n",tid,start,end-1); // Removed l from %ld, unsupported
41 for (i=start; i<end ; i++) {
42 pthread_mutex_lock(&mutexsum);
43 sum += (a[i] * b[i]);
44 pthread_mutex_unlock(&mutexsum);
45 }
46 printf("thread: %d done. Global sum now is=%li\n",tid,sum); // Removed l from %ld, unsupported
47
48 pthread_exit((void*) 0);
49}
50
51int main (int argc, char *argv[])
52{
53long i;
54void *status;
55pthread_t threads[NUMTHRDS];
56pthread_attr_t attr;
57
58/* Assign storage and initialize values */
59a = (int*) malloc (NUMTHRDS*VECLEN*sizeof(int));
60b = (int*) malloc (NUMTHRDS*VECLEN*sizeof(int));
61
62for (i=0; i<VECLEN*NUMTHRDS; i++)
63 a[i]=b[i]=1;
64
65/* Initialize mutex variable */
66pthread_mutex_init(&mutexsum, NULL);
67
68/* Create threads as joinable, each of which will execute the dot product
69 * routine. Their offset into the global vectors is specified by passing
70 * the "i" argument in pthread_create().
71 */
72pthread_attr_init(&attr);
73pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
74for(i=0;i<NUMTHRDS;i++)
75 pthread_create(&threads[i], &attr, dotprod, (void *)&i);
76
77pthread_attr_destroy(&attr);
78
79/* Wait on the other threads for final result */
80
81for(i=0;i<NUMTHRDS;i++) {
82 pthread_join(threads[i], &status);
83 }
84/* After joining, print out the results and cleanup */
85printf ("Final Global Sum=%li\n",sum);
86free (a);
87free (b);
88pthread_mutex_destroy(&mutexsum);
89pthread_exit(NULL);
90}
Note: See TracBrowser for help on using the repository browser.