Révision 26 Pi/C/Pthreads/Pi_Pthreads.c
Pi_Pthreads.c (revision 26) | ||
---|---|---|
13 | 13 |
#include <stdlib.h> |
14 | 14 |
#include <math.h> |
15 | 15 |
#include <stdio.h> |
16 |
#include <limits.h> |
|
16 | 17 |
|
17 | 18 |
#define NUM_THREADS 1024 |
18 | 19 |
|
19 | 20 |
#define ITERATIONS 1000000000 |
20 | 21 |
|
21 | 22 |
#ifdef LONG |
22 |
#define LENGTH unsigned long
|
|
23 |
#define LENGTH long long
|
|
23 | 24 |
#else |
24 |
#define LENGTH unsigned int
|
|
25 |
#define LENGTH int |
|
25 | 26 |
#endif |
26 | 27 |
|
27 | 28 |
struct thread_data |
... | ... | |
82 | 83 |
z = my_data->seed_z; |
83 | 84 |
w = my_data->seed_w; |
84 | 85 |
|
85 |
printf("\tThread #%i, with seeds (%u,%u) and %lu !\n",
|
|
86 |
taskid,z,w,(unsigned long)iterations);
|
|
86 |
printf("\tThread #%i, with seeds (%u,%u) and %lld !\n",
|
|
87 |
taskid,z,w,(long long)iterations);
|
|
87 | 88 |
|
88 | 89 |
for (LENGTH i=0;i<iterations;i++) { |
89 | 90 |
|
... | ... | |
121 | 122 |
printf("\t\t#1 : number of iterations (default 1 billion)\n"); |
122 | 123 |
printf("\t\t#2 : number of threads (default 1)\n\n"); |
123 | 124 |
} |
124 |
|
|
125 |
|
|
126 |
printf ("Sizeof int = %d bytes.\n", sizeof(int)); |
|
127 |
printf ("Sizeof long = %d bytes.\n", sizeof(long)); |
|
128 |
printf ("Sizeof long long = %d bytes.\n", sizeof(long long)); |
|
129 |
|
|
130 |
printf ("Max int = %u\n", INT_MAX); |
|
131 |
printf ("Max long = %ld\n", LONG_MAX); |
|
132 |
printf ("Max long long = %lld\n", LLONG_MAX); |
|
133 |
|
|
125 | 134 |
printf("\tNumber of threads defined to %u\n",num_threads); |
126 |
printf("\tNumber of iterations defined to %lu\n\n",(unsigned long)iterations);
|
|
135 |
printf("\tNumber of iterations defined to %lld\n\n",(long long)iterations);
|
|
127 | 136 |
|
128 | 137 |
/* Initialize and set thread detached attribute */ |
129 | 138 |
pthread_attr_init(&attr); |
... | ... | |
132 | 141 |
for(t=0;t<num_threads;t++) { |
133 | 142 |
|
134 | 143 |
thread_data_array[t].thread_id = t; |
135 |
thread_data_array[t].iterations = iterations/num_threads; |
|
144 |
thread_data_array[t].iterations = iterations/(long long)num_threads;
|
|
136 | 145 |
thread_data_array[t].seed_w = (t+1)<<4; |
137 | 146 |
thread_data_array[t].seed_z = (1048576*(t+1))>>4; |
138 | 147 |
thread_data_array[t].inside = 0; |
... | ... | |
161 | 170 |
} |
162 | 171 |
|
163 | 172 |
for(t=0;t<num_threads;t++) { |
164 |
printf("\tReturn to main with %i thread, %lu inside\n",
|
|
165 |
t,(unsigned long)thread_data_array[t].inside);
|
|
173 |
printf("\tReturn to main with %i thread, %lld inside\n",
|
|
174 |
t,(long long)thread_data_array[t].inside);
|
|
166 | 175 |
inside+=thread_data_array[t].inside; |
167 | 176 |
} |
168 | 177 |
|
... | ... | |
170 | 179 |
|
171 | 180 |
pi=4.*(float)inside/(float)iterations; |
172 | 181 |
|
173 |
printf("\tPi=%f with error %f and %lu iterations\n\n",pi,
|
|
174 |
fabs(pi-4*atan(1))/pi,(unsigned long)iterations);
|
|
182 |
printf("\tPi=%f with error %f and %lld iterations\n\n",pi,
|
|
183 |
fabs(pi-4*atan(1))/pi,(long long)iterations);
|
|
175 | 184 |
|
176 | 185 |
pthread_exit(NULL); |
177 | 186 |
} |
Formats disponibles : Unified diff