Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdlib.h>
- #include<stdio.h>
- #include<pthread.h>
- #include <math.h>
- #include"pomiar_czasu.h"
- #define ROZMIAR 10000000
- #define LICZBA_W 8
- #define PI 3.141592653
- pthread_mutex_t muteks;
- pthread_t watki[LICZBA_W];
- double global_array_of_local_sums[LICZBA_W];
- void *suma_w( void *arg_wsk);
- void *suma_w_no_mutex( void *arg_wsk);
- void *calka_w ( void *calka_w );
- double *tab;
- double suma=0;
- int main( int argc, char *argv[] ){
- int i;
- double t1,t2,t3;
- int indeksy[LICZBA_W];
- for(i=0;i<LICZBA_W;i++) indeksy[i]=i;
- tab = (double *) malloc(ROZMIAR*sizeof(double));
- for(i=0; i<ROZMIAR; i++ ) tab[i] = ((double) i+1) / ROZMIAR;
- pthread_mutex_init( &muteks, NULL);
- printf("Liczba watkow: %d, Rozmiar: %d\n", LICZBA_W, ROZMIAR);
- printf("Poczatek tworzenia watkow\n");
- t1 = czas_zegara();
- for(i=0; i<LICZBA_W; i++ )
- pthread_create( &watki[i], NULL, calka_w, (void *) &indeksy[i] );
- // synchronization error !!!
- // pthread_create( &watki[i], NULL, suma_w, (void *) &i );
- for(i=0; i<LICZBA_W; i++ ) pthread_join( watki[i], NULL );
- t1 = czas_zegara() - t1;
- printf("suma = %lf\n", suma);
- printf("Czas obliczen = %lf\n", t1);
- /* // version with array of local sums (to eliminate the mutex)
- suma =0;
- printf("Poczatek tworzenia watkow\n");
- t1 = czas_zegara();
- for(i=0; i<LICZBA_W; i++ ) {
- global_array_of_local_sums[i]=0.0;
- pthread_create( &watki[i], NULL, suma_w_no_mutex, (void *) &indeksy[i] );
- // synchronization error !!!
- //pthread_create( &watki[i], NULL, suma_w, (void *) &i );
- }
- for(i=0; i<LICZBA_W; i++ ) {
- pthread_join( watki[i], NULL );
- suma += global_array_of_local_sums[i];
- }
- t1 = czas_zegara() - t1;
- printf("suma = %lf\n", suma);
- printf("Czas obliczen (no mutex) = %lf\n", t1);
- */
- /* suma =0; */
- /* printf("Poczatek tworzenia watkow OpenMP\n"); */
- /* t1 = czas_zegara(); */
- /* #pragma omp parallel for num_threads(LICZBA_W) default(none) shared (tab) reduction(+:suma) */
- /* for(i=0;i<ROZMIAR;i++){ */
- /* suma += tab[i]; */
- /* } */
- /* t1 = czas_zegara() - t1; */
- /* printf("suma = %lf\n", suma); */
- /* printf("Czas obliczen OpenMP = %lf\n", t1); */
- }
- void *suma_w( void *arg_wsk){
- int i, j, moj_id;
- double moja_suma=0;
- moj_id = *( (int *) arg_wsk );
- j=ROZMIAR/LICZBA_W;
- for( i=j*moj_id+1; i<=j*(moj_id+1); i++){
- moja_suma += tab[i];
- }
- pthread_mutex_lock( &muteks );
- suma += moja_suma;
- pthread_mutex_unlock( &muteks );
- pthread_exit( (void *)0);
- }
- void *suma_w_no_mutex( void *arg_wsk){
- int i, j, moj_id;
- moj_id = *( (int *) arg_wsk );
- j=ROZMIAR/LICZBA_W;
- for( i=j*moj_id+1; i<=j*(moj_id+1); i++){
- global_array_of_local_sums[moj_id] += tab[i];
- }
- pthread_exit( (void *)0);
- }
- double f(double x) {
- return sin(x);
- }
- void *calka_w(void *arg_wsk) {
- double c, dx, b, a, x1, x2;
- int i, j, moj_id;
- j=ROZMIAR/LICZBA_W;
- a=j*moj_id+1;
- b=PI;
- x1=a;
- c=0.0;
- dx = (b-a) / ROZMIAR;
- moj_id = *( (int *) arg_wsk );
- for(i=j*moj_id+1; i<=j*(moj_id+1); ++i) {
- x2=x1+dx;
- c+=f(x1)+f(x2);
- x1=x2;
- }
- c *= 0.5*dx;
- pthread_mutex_lock( &muteks );
- suma += c;
- pthread_mutex_unlock( &muteks );
- pthread_exit( (void *)0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement