wrong elapsed time

Hi friends,

i am using the code below:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

/*   
The following structure contains the necessary information  
to allow the function "dotprod" to access its input data and 
place its output into the structure.  This structure is 
unchanged from the sequential version.
*/

typedef struct 
 {
   double      *a;
   double      *b;
   double     sum; 
   int     veclen; 
 } DOTDATA;

/* Define globally accessible variables and a mutex */

#define NUMTHRDS 4
#define VECLEN 100
   DOTDATA dotstr; 
   pthread_t thread[NUMTHRDS];
   pthread_mutex_t mutexsum;

/*
The function dotprod is activated when the thread is created.
As before, all input to this routine is obtained from a structure 
of type DOTDATA and all output from this function is written into
this structure. The benefit of this approach is apparent for the 
multi-threaded program: when a thread is created we pass a single
argument to the activated function - typically this argument
is a thread number. All  the other information required by the 
function is accessed from the globally accessible structure. 
*/

void *dotprod(void *arg)
{

/* Define and use local variables for convenience */

   int i, start, end, len ;
   long offset;
   double mysum, *x, *y;
   offset = (long)arg;
     
   len = dotstr.veclen/NUMTHRDS;
   start = offset*len;
   end   = start + len;
   x = dotstr.a;
   y = dotstr.b;

/*
Perform the dot product and assign result
to the appropriate variable in the structure. 
*/

   mysum = 0;
   for (i=start; i<end ; i++) 
    {
      mysum += (x[i] * y[i]);
    }

/*
Lock a mutex prior to updating the value in the shared
structure, and unlock it upon updating.
*/
   pthread_mutex_lock (&mutexsum);
   dotstr.sum += mysum;
   pthread_mutex_unlock (&mutexsum);

   pthread_exit((void*) 0);
}

int main (int argc, char *argv[])
{
	long i;
	double *a, *b;
	void *status;

	/* Assign storage and initialize values */

	a = (double*) malloc (VECLEN*sizeof(double));
	b = (double*) malloc (VECLEN*sizeof(double));
  
	for (i=0; i<VECLEN; i++) {
		a[i]=1;
		b[i]=a[i];
	}

	dotstr.veclen = VECLEN; 
	dotstr.a = a; 
	dotstr.b = b; 
	dotstr.sum=0;

	pthread_mutex_init(&mutexsum, NULL);
         
	struct timeval t1, t2;

	gettimeofday(&t1, NULL);		//start time.

	for(i=0;i<NUMTHRDS;i++)
	{
		/* Each thread works on a different set of data.
		* The offset is specified by 'i'. The size of
		* the data for each thread is indicated by VECLEN.
		*/
		pthread_create(&thread[i], NULL, dotprod, (void *)i); 
	}

	gettimeofday(&t2, NULL);		//end time.

	/* Wait on the other threads */
	for(i=0;i<NUMTHRDS;i++) {
		pthread_join(thread[i], &status);
	}
	/* After joining, print out the results and cleanup */

	printf ("\nSum =  %f\n", dotstr.sum);
	printf ("Number of Threads: %d\n", NUMTHRDS);
	printf ("Elapsed time     : %ld\n",t2.tv_usec - t1.tv_usec);
	free (a);
	free (b);
	pthread_mutex_destroy(&mutexsum);
	pthread_exit(NULL);
}   

how to:
compile: gcc -lpthread -o dot dotprod_mutex.c
execute: ./dot


I am trying to execute it using 1,2 and 4 threads. So, each time i change the line 22. The problem is that when i use 1 thread the elapsed time is 38, with 2 threads the elapsed time is 81 and with 4 i receive 97 microseconds. However, the time elapsed must be greater when we use 1 thread than 4 and/or 2 threads. Or when we use 2 threads the elapsed time must be greater than 4 threads.

Any idea, please.


Thank you.
Are you running this on a multicore machine?
You should mark the end time after the join. You mark when they've all been created, but they'll still be running at line 113.
Thanks kbw i will change this.

Nice question jsmith, i just checked it and it has ...1 core !

Thank you very much.
Topic archived. No new replies allowed.