#include #include #include "timers.h" #define MAX_NUM 100000 #define NUM_THREADS 4 typedef struct { pthread_mutex_t* mutex; int *p; int *n; int *lock; } thread_args; int p=0; void _lock(int *_lock){ while(__sync_lock_test_and_set(_lock, 1)); } void _release(int *_lock) { *_lock = 0; } void* func (void* arg) { int i; thread_args * args = (thread_args*) arg; pthread_mutex_t *mutex = args->mutex; i..
#include #include #include #include #define NUM_THREAD 3 typedef enum {ROCK, SCISSOR, PAPER} decision_t; char* toString[3] = {"ROCK", "SCISSOR", "PAPER"}; static int my_rand() { return omp_get_thread_num() ^ time(NULL); } int main(int argc, char** argv) { int i, tid; decision_t decision[NUM_THREAD]; decision_t my_result; decision_t winner, loser; int somebody_winner = 0, somebody_loser = 0; #pra..
#include #include #include #include #include #define N 100000 //array size #define M 1000000 //number area int data[N]; int buckets[M]; int *my_buckets[16]; void init_array(int a[N], int size) { int i; for( i = 0 ; i < size ; i++) { a[i] = rand()%M; } } void omp_thread(int a[N], int b[M]) { int i; #pragma omp parallel for num_threads(16) private(i) for(i = 0; i < N ; i++) { #pragma omp atomic b[..
#include #include #include int main(int argc, char** argv) { char prompt[][11] = {"ordinary", "gcc_atomic", "critical", "atomic"}; int select_item; if (argc < 2) return 0; select_item = atoi(argv[1]); int shared_value = 0; double t = omp_get_wtime(); #pragma omp parallel num_threads(16) { int i; if(select_item == 0) // ordinary { #pragma omp parallel for shared(shared_value) for( i = 0; i < 1000..
#include #include #define NDIM 1024 double a[NDIM][NDIM]; double b[NDIM][NDIM]; double c[NDIM][NDIM]; void mat_mul_ijk(double c[NDIM][NDIM], double a[NDIM][NDIM], double b[NDIM][NDIM],int level_num); void init_array(double a[NDIM][NDIM]) { int i, j; for(i = 0; i < NDIM ; i++) for(j = 0; j < NDIM ; j++) a[i][j] = rand()%100000 + 1; } void init_zero(double a[NDIM][NDIM]) { int i, j; for(i = 0; i <..
#include #include #include #include #include "timers.h" #define NDIM 1024 double a[NDIM][NDIM]; double b[NDIM][NDIM]; double c[NDIM][NDIM]; void matrix_print(double x[NDIM][NDIM]) { int i, j; for(i = 0; i < NDIM ; i++) { for(j = 0; j < NDIM ; j++) printf("%.2lf ",x[i][j]); printf("\n"); } } /* void matrix_multiply(double a[NDIM][NDIM], double b[NDIM][NDIM], double c[NDIM][NDIM], int num_threads)..
#include #include #include "timers.h" #define N 10 void share_aSum(int a[N]) { int i, sum = 0; timer_start(1); #pragma omp parallel for shared(sum) for(i = 0; i < N ; i++) { sum += a[i]; } timer_stop(1); printf("share_aSum : %lfsec / sum : %d\n",timer_read(1),sum); } void share_atomic_aSum(int a[N]) { int i, sum = 0; timer_start(2); #pragma omp parallel for shared(sum) for(i = 0; i < N ; i++) { ..
#include #include #define N 20 int main(int argc, char** argv) { int i, j; int a[N]; if(argc < 2) return 0; int nn = atoi(argv[1]); if(nn == 0) { #pragma omp parallel for shared(j) for(i = 0; i < N ; i++) { int sum = 0; for(j = 0; j < i ; j++) { a[i] += j; } } } else if (nn == 1) { #pragma omp parallel for private(j) for(i = 0; i < N ; i++) { int sum = 0; for(j = 0; j < i ; j++) a[i] += j; } } e..