source: CIVL/examples/translation/pthread/bug6fix.cvl@ 764d472

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

Added basic scheduling header, modified pthread_mutex_lock as well as mutliple other methods

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

  • Property mode set to 100644
File size: 3.0 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 <civlc.h>
15#include "pthread.h"
16#include <stdio.h>
17#include <stdlib.h>
18
19/* Define global data where everyone can see them */
20$input int NUMTHRDS;
21$input int VECLEN;
22pthread_mutex_t mutexsum;
23int *a, *b;
24long sum=0.0;
25
26void *dotprod(void *arg)
27{
28 /* Each thread works on a different set of data.
29 * The offset is specified by the arg parameter. The size of
30 * the data for each thread is indicated by VECLEN.
31 */
32 int i, start, end, offset, len;
33 long tid;
34 tid = (long)*arg; // Dereference rather than direct conv
35 offset = tid;
36 len = VECLEN;
37 start = offset*len;
38 end = start + len;
39
40 /* Perform my section of the dot product */
41 printf("thread: %d starting. start=%d end=%d\n",tid,start,end-1); // Removed l from %ld, unsupported
42 for (i=start; i<end ; i++) {
43 pthread_mutex_lock(&mutexsum);
44 int tmp = sum;
45 tmp += (a[i] * b[i]);
46 sum = tmp;
47 pthread_mutex_unlock(&mutexsum);
48 }
49 printf("thread: %d done. Global sum now is=%d\n",tid,sum); // Removed l from %ld, unsupported
50
51 pthread_exit(NULL, false, NULL, 0); //Different parameters
52}
53
54int main (void)
55{
56 long i;
57 long j[NUMTHRDS];
58 void *status;
59 pthread_t threads[NUMTHRDS];
60 pthread_attr_t attr;
61
62 /* Assign storage and initialize values */
63 a = (int*) malloc (NUMTHRDS*VECLEN*sizeof(int));
64 b = (int*) malloc (NUMTHRDS*VECLEN*sizeof(int));
65
66 for (i=0; i<VECLEN*NUMTHRDS; i++)
67 a[i]=b[i]=1;
68
69 /* Initialize mutex variable */
70 pthread_mutex_init(&mutexsum, NULL);
71
72 /* Create threads as joinable, each of which will execute the dot product
73 * routine. Their offset into the global vectors is specified by passing
74 * the "i" argument in pthread_create().
75 */
76 pthread_attr_init(&attr);
77 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
78 for(i=0;i<NUMTHRDS;i++){
79 //Add values into array and use address so that each value is unique as int to void * conversion is not supported
80 j[i] = (long)i;
81 pthread_create(&threads[i], &attr, dotprod, (void *)&j[i]);
82 }
83 pthread_attr_destroy(&attr);
84
85 /* Wait on the other threads for final result */
86 for(i=0;i<NUMTHRDS;i++) {
87 pthread_join(threads[i], &status);
88 }
89
90 /* After joining, print out the results and cleanup */
91 printf ("Final Global Sum=%d\n",sum);
92
93 free (a);
94 free (b);
95 pthread_mutex_destroy(&mutexsum);
96 //pthread_exit(NULL);
97 return 0;
98}
Note: See TracBrowser for help on using the repository browser.