From 0ae5d6e49703afe740f24729c6968b7119a66294 Mon Sep 17 00:00:00 2001 From: pap0012 Date: Wed, 17 Apr 2019 16:50:32 +0200 Subject: [PATCH 01/11] last updates --- src/intrinsic.c | 8 ++++++-- src/libminiomp.c | 2 ++ src/libminiomp.h | 1 + src/parallel.c | 42 +++++++++++++++++++++++++----------------- src/parallel.h | 11 ++++++----- src/thread.c | 7 ++++++- src/thread.h | 9 ++++++--- test/tparallel.c | 2 +- test/tworkshare | Bin 0 -> 6536 bytes 9 files changed, 53 insertions(+), 29 deletions(-) create mode 100755 test/tworkshare diff --git a/src/intrinsic.c b/src/intrinsic.c index 005c783..26bb56d 100644 --- a/src/intrinsic.c +++ b/src/intrinsic.c @@ -10,8 +10,12 @@ int omp_get_num_threads (void) { int omp_get_thread_num (void) { //printf("TBI: omp_get_thread_num still doesn't know who I am ... let's say I am 0\n"); - int thread_id = ((miniomp_parallel_t*) (pthread_getspecific(miniomp_specifickey)))->id; - return(thread_id); + printf("Called get_thread: \n"); + miniomp_thread_t *thread = pthread_getspecific(miniomp_specifickey); + printf("Casted getspecific \n"); + unsigned int thread_id = thread->id; + printf("%d\n", thread_id); + return((int)thread_id); } // No need to implement this function, it is just involked by Extrae at some point diff --git a/src/libminiomp.c b/src/libminiomp.c index 26278d3..997e24e 100644 --- a/src/libminiomp.c +++ b/src/libminiomp.c @@ -8,6 +8,8 @@ void fini_miniomp(void) __attribute__((destructor)); // Function to parse OMP_NUM_THREADS environment variable void parse_env(void); +pthread_key_t miniomp_specifickey; + void init_miniomp(void) { printf ("mini-omp is being initialized\n"); diff --git a/src/libminiomp.h b/src/libminiomp.h index 60d601c..6ddd77f 100644 --- a/src/libminiomp.h +++ b/src/libminiomp.h @@ -23,3 +23,4 @@ extern pthread_key_t miniomp_specifickey; #include "loop.h" #include "single.h" #include "task.h" + diff --git a/src/parallel.c b/src/parallel.c index 03233a6..9f94e9a 100644 --- a/src/parallel.c +++ b/src/parallel.c @@ -3,7 +3,7 @@ // This file implements the PARALLEL construct // Declaration of array for storing pthread identifier from pthread_create function -pthread_t *miniomp_threads; +miniomp_thread_t *miniomp_threads; // Global variable for parallel descriptor miniomp_parallel_t *miniomp_parallel; @@ -11,38 +11,46 @@ miniomp_parallel_t *miniomp_parallel; // Declaration of per-thread specific key pthread_key_t miniomp_specifickey; +void miniomp_thread_init(miniomp_thread_t * thread, unsigned int id, void (*fn) (void *), miniomp_parallel_t *region){ + thread->id = id; + thread->region = region; + pthread_setspecific(miniomp_specifickey, thread); + pthread_create(&(thread->pthread), NULL, fn, thread); +} + + // This is the prototype for the Pthreads starting function -void *worker(void *args) { - miniomp_parallel_t *parallel_t = args; - int id = parallel_t->id; +void worker(void *args) { + miniomp_thread_t *thread = args; + miniomp_parallel_t *parallel = thread->region; + int id = thread->id; printf("Thread %d initialized\n", id); - void (*fn) (void *) = parallel_t->fn; - void * data = parallel_t->fn_data; - pthread_setspecific(miniomp_specifickey, parallel_t); + void (*fn) (void *) = parallel->fn; + void * data = parallel->fn_data; + //printf("Thread %d fn and data done\n", id); fn(data); + //printf("Executed fn in thread %d", id); // insert all necessary code here for: // 1) save thread-specific data // 2) invoke the per-threads instance of function encapsulating the parallel region // 3) exit the function - return(NULL); } void GOMP_parallel (void (*fn) (void *), void *data, unsigned num_threads, unsigned int flags) { if(!num_threads) num_threads = omp_get_num_threads(); printf("Starting a parallel region using %d threads\n", num_threads); - miniomp_threads = malloc(num_threads*sizeof(pthread_t)); - miniomp_parallel = malloc(sizeof(miniomp_parallel_t)*num_threads); + miniomp_threads = malloc(num_threads*sizeof(miniomp_thread_t)); + miniomp_parallel = malloc(sizeof(miniomp_parallel_t)); + miniomp_parallel->fn = fn; + miniomp_parallel->fn_data = data; + miniomp_parallel->id = 0; + pthread_mutex_init(&(miniomp_parallel->mutex), NULL); for (int i=0; i // Declaration of array for storing pthread identifiers from pthread_create function -extern pthread_t *miniomp_threads; // Type declaration for parallel descriptor (arguments needed to create pthreads) typedef struct { void (*fn) (void *); void *fn_data; - int id; + unsigned int id; pthread_mutex_t mutex; // complete the definition of parallel descriptor } miniomp_parallel_t; typedef struct { unsigned int id; -} miniomp_parallel_region; + pthread_t pthread; + miniomp_parallel_t *region; +} miniomp_thread_t; extern miniomp_parallel_t *miniomp_parallel; - -// Declaration of per-thread specific key extern pthread_key_t miniomp_specifickey; // Functions implemented in this module +void miniomp_parallel_init(miniomp_parallel_t *parallel, void (*fn) (void *), void *data, unsigned int id); +void miniomp_thread_init(miniomp_thread_t * thread, unsigned int id, void (*fn) (void *), miniomp_parallel_t *region); void GOMP_parallel (void (*fn) (void *), void *data, unsigned num_threads, unsigned int flags); diff --git a/src/thread.c b/src/thread.c index 75f278d..5c4b694 100644 --- a/src/thread.c +++ b/src/thread.c @@ -1,6 +1,11 @@ #include "thread.h" +#include "libminiomp.h" -void miniomp_thread_init(miniomp_thread * thread, unsigned int id, void (*fn) (void *), void *data){ +pthread_key_t miniomp_specifickey; + +void miniomp_thread_init(miniomp_thread_t * thread, unsigned int id, void (*fn) (void *), void *data){ thread->id = id; + thread->region = data; pthread_create(thread->pthread, NULL, fn, data); + pthread_setspecific(miniomp_specifickey, thread); } diff --git a/src/thread.h b/src/thread.h index 73d797c..285c6a2 100644 --- a/src/thread.h +++ b/src/thread.h @@ -1,9 +1,12 @@ #include -#include "libminiomp.h" + typedef struct { unsigned int id; pthread_t pthread; -} miniomp_thread; + struct miniomp_parallel_t *region; +} miniomp_thread_t; + +extern pthread_key_t miniomp_specifickey; -void miniomp_thread_init(miniomp_thread * thread, unsigned int id); +void miniomp_thread_init(miniomp_thread_t * thread, unsigned int id, void (*fn) (void *), void *data); diff --git a/test/tparallel.c b/test/tparallel.c index 4d46902..23941b0 100644 --- a/test/tparallel.c +++ b/test/tparallel.c @@ -8,7 +8,7 @@ int foo() { int i, x = 1023; #pragma omp parallel firstprivate(x) reduction(+:first) if(x>0) num_threads(2) { - x++; + x++; first += x; } diff --git a/test/tworkshare b/test/tworkshare new file mode 100755 index 0000000000000000000000000000000000000000..ac1504db19ac2c261ee7e62f066aac7dbe17a4e6 GIT binary patch literal 6536 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 Date: Wed, 17 Apr 2019 19:19:44 +0200 Subject: [PATCH 02/11] Made specific keys actually thread specific --- src/libminiomp.c | 1 - src/parallel.c | 14 ++++++-------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/libminiomp.c b/src/libminiomp.c index 997e24e..368e2d5 100644 --- a/src/libminiomp.c +++ b/src/libminiomp.c @@ -17,7 +17,6 @@ init_miniomp(void) { parse_env(); // Initialize Pthread data structures // Initialize Pthread thread-specific data, useful for example to store the OpenMP thread identifier - pthread_key_create(&miniomp_specifickey, NULL); // Initialize OpenMP default lock and default barrier // Initialize OpenMP workdescriptors for for and single // Initialize OpenMP task queue for task and taskloop diff --git a/src/parallel.c b/src/parallel.c index 9f94e9a..89523ba 100644 --- a/src/parallel.c +++ b/src/parallel.c @@ -9,31 +9,28 @@ miniomp_thread_t *miniomp_threads; miniomp_parallel_t *miniomp_parallel; // Declaration of per-thread specific key -pthread_key_t miniomp_specifickey; +extern pthread_key_t miniomp_specifickey; void miniomp_thread_init(miniomp_thread_t * thread, unsigned int id, void (*fn) (void *), miniomp_parallel_t *region){ thread->id = id; thread->region = region; - pthread_setspecific(miniomp_specifickey, thread); pthread_create(&(thread->pthread), NULL, fn, thread); } // This is the prototype for the Pthreads starting function void worker(void *args) { + pthread_key_create(&miniomp_specifickey, NULL); miniomp_thread_t *thread = args; + pthread_setspecific(miniomp_specifickey, thread); miniomp_parallel_t *parallel = thread->region; int id = thread->id; printf("Thread %d initialized\n", id); void (*fn) (void *) = parallel->fn; void * data = parallel->fn_data; - //printf("Thread %d fn and data done\n", id); + printf("Thread %d fn and data done\n", id); fn(data); - //printf("Executed fn in thread %d", id); - // insert all necessary code here for: - // 1) save thread-specific data - // 2) invoke the per-threads instance of function encapsulating the parallel region - // 3) exit the function + printf("Executed fn in thread %d\n", id); } void @@ -50,6 +47,7 @@ GOMP_parallel (void (*fn) (void *), void *data, unsigned num_threads, unsigned i miniomp_thread_init(&miniomp_threads[i], i, worker, miniomp_parallel); } for (int i=0; i < num_threads; i++){ + printf("Thread %i arrived to join\n", i); pthread_join(miniomp_threads[i].pthread, NULL); } free(miniomp_threads); From 0de1643b541d503586cc6fc96fc7cc80293684f7 Mon Sep 17 00:00:00 2001 From: pap0012 Date: Wed, 24 Apr 2019 20:10:49 +0200 Subject: [PATCH 03/11] Camilo --- src/intrinsic.c | 6 +++--- src/parallel.c | 14 +++++++++----- src/parallel.h | 1 + src/synchronization.c | 19 ++++++++++++++----- 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/intrinsic.c b/src/intrinsic.c index 26bb56d..4468ede 100644 --- a/src/intrinsic.c +++ b/src/intrinsic.c @@ -10,11 +10,11 @@ int omp_get_num_threads (void) { int omp_get_thread_num (void) { //printf("TBI: omp_get_thread_num still doesn't know who I am ... let's say I am 0\n"); - printf("Called get_thread: \n"); + //printf("Called get_thread: \n"); miniomp_thread_t *thread = pthread_getspecific(miniomp_specifickey); - printf("Casted getspecific \n"); + //printf("Casted getspecific \n"); unsigned int thread_id = thread->id; - printf("%d\n", thread_id); + //printf("THREAD ID IS %d\n", thread_id); return((int)thread_id); } diff --git a/src/parallel.c b/src/parallel.c index 89523ba..45b66dd 100644 --- a/src/parallel.c +++ b/src/parallel.c @@ -20,7 +20,7 @@ void miniomp_thread_init(miniomp_thread_t * thread, unsigned int id, void (*fn) // This is the prototype for the Pthreads starting function void worker(void *args) { - pthread_key_create(&miniomp_specifickey, NULL); + //pthread_key_create(&miniomp_specifickey, NULL); miniomp_thread_t *thread = args; pthread_setspecific(miniomp_specifickey, thread); miniomp_parallel_t *parallel = thread->region; @@ -28,9 +28,9 @@ void worker(void *args) { printf("Thread %d initialized\n", id); void (*fn) (void *) = parallel->fn; void * data = parallel->fn_data; - printf("Thread %d fn and data done\n", id); + //printf("Thread %d fn and data done\n", id); fn(data); - printf("Executed fn in thread %d\n", id); + //printf("Executed fn in thread %d\n", id); } void @@ -41,15 +41,19 @@ GOMP_parallel (void (*fn) (void *), void *data, unsigned num_threads, unsigned i miniomp_parallel = malloc(sizeof(miniomp_parallel_t)); miniomp_parallel->fn = fn; miniomp_parallel->fn_data = data; - miniomp_parallel->id = 0; + miniomp_parallel->id = 0; + pthread_barrier_init(&(miniomp_parallel->barrier), NULL, num_threads); pthread_mutex_init(&(miniomp_parallel->mutex), NULL); + pthread_key_create(&miniomp_specifickey, NULL); for (int i=0; imutex)); + pthread_barrier_destroy(&(miniomp_parallel->barrier)); free(miniomp_threads); free(miniomp_parallel); } diff --git a/src/parallel.h b/src/parallel.h index a79cfb7..123608a 100644 --- a/src/parallel.h +++ b/src/parallel.h @@ -8,6 +8,7 @@ typedef struct { void *fn_data; unsigned int id; pthread_mutex_t mutex; + pthread_barrier_t barrier; // complete the definition of parallel descriptor } miniomp_parallel_t; diff --git a/src/synchronization.c b/src/synchronization.c index 04f74bb..c94216a 100644 --- a/src/synchronization.c +++ b/src/synchronization.c @@ -4,27 +4,36 @@ pthread_mutex_t miniomp_default_lock; void GOMP_critical_start (void) { - printf("TBI: Entering an unnamed critical, don't know if anyone else is alrady in. I proceed\n"); + miniomp_thread_t *thread = pthread_getspecific(miniomp_specifickey); + pthread_mutex_lock(&(thread->region->mutex)); + //printf("TBI: Entering an unnamed critical, don't know if anyone else is alrady in. I proceed\n"); } void GOMP_critical_end (void) { - printf("TBI: Exiting an unnamed critical section. I can not inform anyone else, bye!\n"); + miniomp_thread_t *thread = pthread_getspecific(miniomp_specifickey); + pthread_mutex_unlock(&(thread->region->mutex)); + //printf("TBI: Exiting an unnamed critical section. I can not inform anyone else, bye!\n"); } void GOMP_critical_name_start (void **pptr) { pthread_mutex_t * plock = *pptr; - printf("TBI: Entering a named critical %p (%p), don't know if anyone else is alrady in. I proceed\n", pptr, plock); + pthread_mutex_lock(plock); + printf("TBI: Entering a named critical %p (%p)\n", pptr, plock); // if plock is NULL it means that the lock associated to the name has not yet been allocated and initialized } void GOMP_critical_name_end (void **pptr) { pthread_mutex_t * plock = *pptr; - printf("TBI: Exiting a named critical %p (%p), I can not inform anyone else, bye!\n", pptr, plock); + pthread_mutex_unlock(plock); + printf("TBI: Exiting a named critical %p (%p)\n", pptr, plock); // if plock is still NULL something went wrong } pthread_barrier_t miniomp_barrier; void GOMP_barrier() { - printf("TBI: Entering in barrier, but do not know how to wait for the rest. I proceed\n"); + miniomp_thread_t *thread = pthread_getspecific(miniomp_specifickey); + printf("Thread %d waiting for signal", thread->id); + pthread_barrier_wait(&(thread->region->barrier)); + } From 3dd0780453bb7f5f9e0adbc859b85206d6f97327 Mon Sep 17 00:00:00 2001 From: Gerard Otero Date: Thu, 25 Apr 2019 15:13:34 +0200 Subject: [PATCH 04/11] added toboada script --- toboada.sh | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100755 toboada.sh diff --git a/toboada.sh b/toboada.sh new file mode 100755 index 0000000..1479238 --- /dev/null +++ b/toboada.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +set -ue + +PAP=${1:-12} + +echo "Upload to boada user pap00${PAP}" + +scp -r src pap00${PAP}@boada.ac.upc.edu:miniomp + +ssh pap00${PAP}@boada.ac.upc.edu \ No newline at end of file From 700e7f848c5265237a29160c3653b2c73fe133b1 Mon Sep 17 00:00:00 2001 From: Gerard Otero Date: Fri, 26 Apr 2019 18:10:02 +0200 Subject: [PATCH 05/11] testing --- src/synchronization.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/synchronization.c b/src/synchronization.c index c94216a..7b67795 100644 --- a/src/synchronization.c +++ b/src/synchronization.c @@ -17,6 +17,12 @@ void GOMP_critical_end (void) { void GOMP_critical_name_start (void **pptr) { pthread_mutex_t * plock = *pptr; + printf("Arrived to pointer to name %p", plock); + + //miniomp_thread_t *thread = pthread_getspecific(miniomp_specifickey); + //miniomp_parallel_t *region = thread->region; + + //pthread_setspecific(miniomp_specifickey, thread); pthread_mutex_lock(plock); printf("TBI: Entering a named critical %p (%p)\n", pptr, plock); // if plock is NULL it means that the lock associated to the name has not yet been allocated and initialized From 46f13ffbe43e44128022c90ae6bf35bbaddb6ad3 Mon Sep 17 00:00:00 2001 From: Gerard Otero Date: Sat, 27 Apr 2019 19:16:36 +0200 Subject: [PATCH 06/11] Named critical regions working --- src/synchronization.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/synchronization.c b/src/synchronization.c index 7b67795..a5bb0df 100644 --- a/src/synchronization.c +++ b/src/synchronization.c @@ -16,22 +16,23 @@ void GOMP_critical_end (void) { } void GOMP_critical_name_start (void **pptr) { - pthread_mutex_t * plock = *pptr; - printf("Arrived to pointer to name %p", plock); + pthread_mutex_t * plock = pptr; + //printf("Arrived to pointer to name %p\n", plock); //miniomp_thread_t *thread = pthread_getspecific(miniomp_specifickey); //miniomp_parallel_t *region = thread->region; //pthread_setspecific(miniomp_specifickey, thread); pthread_mutex_lock(plock); - printf("TBI: Entering a named critical %p (%p)\n", pptr, plock); + //printf("TBI: Entering a named critical %p (%p)\n", pptr, plock); // if plock is NULL it means that the lock associated to the name has not yet been allocated and initialized } void GOMP_critical_name_end (void **pptr) { - pthread_mutex_t * plock = *pptr; + pthread_mutex_t * plock = pptr; + //printf("Arrived to pointer to name %p\n", plock); pthread_mutex_unlock(plock); - printf("TBI: Exiting a named critical %p (%p)\n", pptr, plock); + //printf("TBI: Exiting a named critical %p (%p)\n", pptr, plock); // if plock is still NULL something went wrong } @@ -39,7 +40,7 @@ pthread_barrier_t miniomp_barrier; void GOMP_barrier() { miniomp_thread_t *thread = pthread_getspecific(miniomp_specifickey); - printf("Thread %d waiting for signal", thread->id); + printf("Thread %d waiting for signal\n", thread->id); pthread_barrier_wait(&(thread->region->barrier)); } From ecbdcfe8df8d5fc21e22fc710502a5a6583114fb Mon Sep 17 00:00:00 2001 From: Gerard Otero Date: Sat, 27 Apr 2019 20:47:57 +0200 Subject: [PATCH 07/11] Added a little about my interpretation of the task to perform --- src/single.c | 2 ++ src/single.h | 1 + 2 files changed, 3 insertions(+) diff --git a/src/single.c b/src/single.c index c5bc982..f2a7738 100644 --- a/src/single.c +++ b/src/single.c @@ -9,6 +9,8 @@ miniomp_single_t miniomp_single; bool GOMP_single_start (void) { + /* Diría que lo que tenemos que hacer es obtener el miniomp_single de la region a ejecutar + y poner reached a true y retornar true si reached es false, o retornar false si reached es true */ printf("TBI: Entering into single, but don't know who else arrived so I proceed\n"); return(true); } diff --git a/src/single.h b/src/single.h index 72423cf..60c6e0a 100644 --- a/src/single.h +++ b/src/single.h @@ -1,6 +1,7 @@ // Type declaration for single work sharing descriptor typedef struct { // complete the definition of single descriptor + bool reached; } miniomp_single_t; // Declaration of global variable for single work descriptor From d94e93c382c7bb67c32a6d1e0d7d1b8b874d2067 Mon Sep 17 00:00:00 2001 From: Gerard Otero Date: Sun, 28 Apr 2019 18:26:41 +0200 Subject: [PATCH 08/11] Removed comments --- src/intrinsic.c | 4 ---- src/parallel.c | 4 ---- src/synchronization.c | 15 --------------- 3 files changed, 23 deletions(-) diff --git a/src/intrinsic.c b/src/intrinsic.c index 4468ede..1c0d623 100644 --- a/src/intrinsic.c +++ b/src/intrinsic.c @@ -9,12 +9,8 @@ int omp_get_num_threads (void) { } int omp_get_thread_num (void) { - //printf("TBI: omp_get_thread_num still doesn't know who I am ... let's say I am 0\n"); - //printf("Called get_thread: \n"); miniomp_thread_t *thread = pthread_getspecific(miniomp_specifickey); - //printf("Casted getspecific \n"); unsigned int thread_id = thread->id; - //printf("THREAD ID IS %d\n", thread_id); return((int)thread_id); } diff --git a/src/parallel.c b/src/parallel.c index 45b66dd..b6401c7 100644 --- a/src/parallel.c +++ b/src/parallel.c @@ -20,7 +20,6 @@ void miniomp_thread_init(miniomp_thread_t * thread, unsigned int id, void (*fn) // This is the prototype for the Pthreads starting function void worker(void *args) { - //pthread_key_create(&miniomp_specifickey, NULL); miniomp_thread_t *thread = args; pthread_setspecific(miniomp_specifickey, thread); miniomp_parallel_t *parallel = thread->region; @@ -28,9 +27,7 @@ void worker(void *args) { printf("Thread %d initialized\n", id); void (*fn) (void *) = parallel->fn; void * data = parallel->fn_data; - //printf("Thread %d fn and data done\n", id); fn(data); - //printf("Executed fn in thread %d\n", id); } void @@ -49,7 +46,6 @@ GOMP_parallel (void (*fn) (void *), void *data, unsigned num_threads, unsigned i miniomp_thread_init(&miniomp_threads[i], i, worker, miniomp_parallel); } for (int i=0; i < num_threads; i++){ - //printf("Thread %i arrived to join\n", i); pthread_join(miniomp_threads[i].pthread, NULL); } pthread_mutex_destroy(&(miniomp_parallel->mutex)); diff --git a/src/synchronization.c b/src/synchronization.c index a5bb0df..f580992 100644 --- a/src/synchronization.c +++ b/src/synchronization.c @@ -6,41 +6,26 @@ pthread_mutex_t miniomp_default_lock; void GOMP_critical_start (void) { miniomp_thread_t *thread = pthread_getspecific(miniomp_specifickey); pthread_mutex_lock(&(thread->region->mutex)); - //printf("TBI: Entering an unnamed critical, don't know if anyone else is alrady in. I proceed\n"); } void GOMP_critical_end (void) { miniomp_thread_t *thread = pthread_getspecific(miniomp_specifickey); pthread_mutex_unlock(&(thread->region->mutex)); - //printf("TBI: Exiting an unnamed critical section. I can not inform anyone else, bye!\n"); } void GOMP_critical_name_start (void **pptr) { pthread_mutex_t * plock = pptr; - //printf("Arrived to pointer to name %p\n", plock); - - //miniomp_thread_t *thread = pthread_getspecific(miniomp_specifickey); - //miniomp_parallel_t *region = thread->region; - - //pthread_setspecific(miniomp_specifickey, thread); pthread_mutex_lock(plock); - //printf("TBI: Entering a named critical %p (%p)\n", pptr, plock); - // if plock is NULL it means that the lock associated to the name has not yet been allocated and initialized } void GOMP_critical_name_end (void **pptr) { pthread_mutex_t * plock = pptr; - //printf("Arrived to pointer to name %p\n", plock); pthread_mutex_unlock(plock); - //printf("TBI: Exiting a named critical %p (%p)\n", pptr, plock); - // if plock is still NULL something went wrong } pthread_barrier_t miniomp_barrier; void GOMP_barrier() { miniomp_thread_t *thread = pthread_getspecific(miniomp_specifickey); - printf("Thread %d waiting for signal\n", thread->id); pthread_barrier_wait(&(thread->region->barrier)); - } From edc2a3f12f5e49fbf37f0e3c05a42884452c0b54 Mon Sep 17 00:00:00 2001 From: Gerard Otero Date: Sun, 28 Apr 2019 21:01:29 +0200 Subject: [PATCH 09/11] Single regions working --- src/parallel.c | 3 --- src/parallel.h | 6 +++++- src/single.c | 25 +++++++++++++++---------- src/single.h | 8 -------- src/thread.c | 11 ----------- src/thread.h | 12 ------------ 6 files changed, 20 insertions(+), 45 deletions(-) delete mode 100644 src/thread.c delete mode 100644 src/thread.h diff --git a/src/parallel.c b/src/parallel.c index b6401c7..38cfb28 100644 --- a/src/parallel.c +++ b/src/parallel.c @@ -23,8 +23,6 @@ void worker(void *args) { miniomp_thread_t *thread = args; pthread_setspecific(miniomp_specifickey, thread); miniomp_parallel_t *parallel = thread->region; - int id = thread->id; - printf("Thread %d initialized\n", id); void (*fn) (void *) = parallel->fn; void * data = parallel->fn_data; fn(data); @@ -33,7 +31,6 @@ void worker(void *args) { void GOMP_parallel (void (*fn) (void *), void *data, unsigned num_threads, unsigned int flags) { if(!num_threads) num_threads = omp_get_num_threads(); - printf("Starting a parallel region using %d threads\n", num_threads); miniomp_threads = malloc(num_threads*sizeof(miniomp_thread_t)); miniomp_parallel = malloc(sizeof(miniomp_parallel_t)); miniomp_parallel->fn = fn; diff --git a/src/parallel.h b/src/parallel.h index 123608a..9872de9 100644 --- a/src/parallel.h +++ b/src/parallel.h @@ -2,6 +2,10 @@ // Declaration of array for storing pthread identifiers from pthread_create function +typedef struct { + unsigned int id; // id of the thread that reached the single part +} miniomp_single_t; + // Type declaration for parallel descriptor (arguments needed to create pthreads) typedef struct { void (*fn) (void *); @@ -9,7 +13,7 @@ typedef struct { unsigned int id; pthread_mutex_t mutex; pthread_barrier_t barrier; - // complete the definition of parallel descriptor + miniomp_single_t *single; } miniomp_parallel_t; typedef struct { diff --git a/src/single.c b/src/single.c index f2a7738..08b9871 100644 --- a/src/single.c +++ b/src/single.c @@ -1,18 +1,23 @@ #include "libminiomp.h" -// Declaratiuon of global variable for single work descriptor miniomp_single_t miniomp_single; -/* This routine is called when first encountering a SINGLE construct. - Returns true if this is the thread that should execute the clause. */ - bool GOMP_single_start (void) { - /* Diría que lo que tenemos que hacer es obtener el miniomp_single de la region a ejecutar - y poner reached a true y retornar true si reached es false, o retornar false si reached es true */ - printf("TBI: Entering into single, but don't know who else arrived so I proceed\n"); - return(true); + miniomp_thread_t *thread = pthread_getspecific(miniomp_specifickey); + unsigned int id = omp_get_thread_num(); + if (thread->region->single == NULL){ + miniomp_single.id = id; + thread->region->single = &miniomp_single; + return(true); + } + else { + if(thread->region->single->id == id){ + return(true); + } + else{ + return(false); + } + } } - - diff --git a/src/single.h b/src/single.h index 60c6e0a..e69de29 100644 --- a/src/single.h +++ b/src/single.h @@ -1,8 +0,0 @@ -// Type declaration for single work sharing descriptor -typedef struct { - // complete the definition of single descriptor - bool reached; -} miniomp_single_t; - -// Declaration of global variable for single work descriptor -extern miniomp_single_t miniomp_single; diff --git a/src/thread.c b/src/thread.c deleted file mode 100644 index 5c4b694..0000000 --- a/src/thread.c +++ /dev/null @@ -1,11 +0,0 @@ -#include "thread.h" -#include "libminiomp.h" - -pthread_key_t miniomp_specifickey; - -void miniomp_thread_init(miniomp_thread_t * thread, unsigned int id, void (*fn) (void *), void *data){ - thread->id = id; - thread->region = data; - pthread_create(thread->pthread, NULL, fn, data); - pthread_setspecific(miniomp_specifickey, thread); -} diff --git a/src/thread.h b/src/thread.h deleted file mode 100644 index 285c6a2..0000000 --- a/src/thread.h +++ /dev/null @@ -1,12 +0,0 @@ -#include - - -typedef struct { - unsigned int id; - pthread_t pthread; - struct miniomp_parallel_t *region; -} miniomp_thread_t; - -extern pthread_key_t miniomp_specifickey; - -void miniomp_thread_init(miniomp_thread_t * thread, unsigned int id, void (*fn) (void *), void *data); From 102a6c70c910c53748ddddc36863fbc0c4a28273 Mon Sep 17 00:00:00 2001 From: Gerard Otero Date: Sun, 28 Apr 2019 23:30:42 +0200 Subject: [PATCH 10/11] Added malloc for single struct --- src/parallel.c | 3 +++ src/single.c | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/src/parallel.c b/src/parallel.c index 38cfb28..e5d8af3 100644 --- a/src/parallel.c +++ b/src/parallel.c @@ -8,6 +8,8 @@ miniomp_thread_t *miniomp_threads; // Global variable for parallel descriptor miniomp_parallel_t *miniomp_parallel; +miniomp_single_t *miniomp_single; + // Declaration of per-thread specific key extern pthread_key_t miniomp_specifickey; @@ -33,6 +35,7 @@ GOMP_parallel (void (*fn) (void *), void *data, unsigned num_threads, unsigned i if(!num_threads) num_threads = omp_get_num_threads(); miniomp_threads = malloc(num_threads*sizeof(miniomp_thread_t)); miniomp_parallel = malloc(sizeof(miniomp_parallel_t)); + miniomp_single = malloc(sizeof(miniomp_single_t)); miniomp_parallel->fn = fn; miniomp_parallel->fn_data = data; miniomp_parallel->id = 0; diff --git a/src/single.c b/src/single.c index 08b9871..2d32d36 100644 --- a/src/single.c +++ b/src/single.c @@ -7,16 +7,20 @@ GOMP_single_start (void) { miniomp_thread_t *thread = pthread_getspecific(miniomp_specifickey); unsigned int id = omp_get_thread_num(); + pthread_mutex_lock(&(thread->region->mutex)); if (thread->region->single == NULL){ miniomp_single.id = id; thread->region->single = &miniomp_single; + pthread_mutex_unlock(&(thread->region->mutex)); return(true); } else { if(thread->region->single->id == id){ + pthread_mutex_unlock(&(thread->region->mutex)); return(true); } else{ + pthread_mutex_unlock(&(thread->region->mutex)); return(false); } } From fe0bc83be0542531f2906666b9d2458473df6c41 Mon Sep 17 00:00:00 2001 From: Gerard Otero Date: Sun, 28 Apr 2019 23:31:14 +0200 Subject: [PATCH 11/11] Remove empty header --- src/single.h | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/single.h diff --git a/src/single.h b/src/single.h deleted file mode 100644 index e69de29..0000000