Skip to content

Commit 0ae5d6e

Browse files
author
pap0012
committed
last updates
1 parent e7d3c40 commit 0ae5d6e

File tree

9 files changed

+53
-29
lines changed

9 files changed

+53
-29
lines changed

src/intrinsic.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,12 @@ int omp_get_num_threads (void) {
1010

1111
int omp_get_thread_num (void) {
1212
//printf("TBI: omp_get_thread_num still doesn't know who I am ... let's say I am 0\n");
13-
int thread_id = ((miniomp_parallel_t*) (pthread_getspecific(miniomp_specifickey)))->id;
14-
return(thread_id);
13+
printf("Called get_thread: \n");
14+
miniomp_thread_t *thread = pthread_getspecific(miniomp_specifickey);
15+
printf("Casted getspecific \n");
16+
unsigned int thread_id = thread->id;
17+
printf("%d\n", thread_id);
18+
return((int)thread_id);
1519
}
1620

1721
// No need to implement this function, it is just involked by Extrae at some point

src/libminiomp.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ void fini_miniomp(void) __attribute__((destructor));
88
// Function to parse OMP_NUM_THREADS environment variable
99
void parse_env(void);
1010

11+
pthread_key_t miniomp_specifickey;
12+
1113
void
1214
init_miniomp(void) {
1315
printf ("mini-omp is being initialized\n");

src/libminiomp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,4 @@ extern pthread_key_t miniomp_specifickey;
2323
#include "loop.h"
2424
#include "single.h"
2525
#include "task.h"
26+

src/parallel.c

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,46 +3,54 @@
33
// This file implements the PARALLEL construct
44

55
// Declaration of array for storing pthread identifier from pthread_create function
6-
pthread_t *miniomp_threads;
6+
miniomp_thread_t *miniomp_threads;
77

88
// Global variable for parallel descriptor
99
miniomp_parallel_t *miniomp_parallel;
1010

1111
// Declaration of per-thread specific key
1212
pthread_key_t miniomp_specifickey;
1313

14+
void miniomp_thread_init(miniomp_thread_t * thread, unsigned int id, void (*fn) (void *), miniomp_parallel_t *region){
15+
thread->id = id;
16+
thread->region = region;
17+
pthread_setspecific(miniomp_specifickey, thread);
18+
pthread_create(&(thread->pthread), NULL, fn, thread);
19+
}
20+
21+
1422
// This is the prototype for the Pthreads starting function
15-
void *worker(void *args) {
16-
miniomp_parallel_t *parallel_t = args;
17-
int id = parallel_t->id;
23+
void worker(void *args) {
24+
miniomp_thread_t *thread = args;
25+
miniomp_parallel_t *parallel = thread->region;
26+
int id = thread->id;
1827
printf("Thread %d initialized\n", id);
19-
void (*fn) (void *) = parallel_t->fn;
20-
void * data = parallel_t->fn_data;
21-
pthread_setspecific(miniomp_specifickey, parallel_t);
28+
void (*fn) (void *) = parallel->fn;
29+
void * data = parallel->fn_data;
30+
//printf("Thread %d fn and data done\n", id);
2231
fn(data);
32+
//printf("Executed fn in thread %d", id);
2333
// insert all necessary code here for:
2434
// 1) save thread-specific data
2535
// 2) invoke the per-threads instance of function encapsulating the parallel region
2636
// 3) exit the function
27-
return(NULL);
2837
}
2938

3039
void
3140
GOMP_parallel (void (*fn) (void *), void *data, unsigned num_threads, unsigned int flags) {
3241
if(!num_threads) num_threads = omp_get_num_threads();
3342
printf("Starting a parallel region using %d threads\n", num_threads);
34-
miniomp_threads = malloc(num_threads*sizeof(pthread_t));
35-
miniomp_parallel = malloc(sizeof(miniomp_parallel_t)*num_threads);
43+
miniomp_threads = malloc(num_threads*sizeof(miniomp_thread_t));
44+
miniomp_parallel = malloc(sizeof(miniomp_parallel_t));
45+
miniomp_parallel->fn = fn;
46+
miniomp_parallel->fn_data = data;
47+
miniomp_parallel->id = 0;
48+
pthread_mutex_init(&(miniomp_parallel->mutex), NULL);
3649
for (int i=0; i<num_threads; i++){
37-
//pthread_mutex_init(&miniomp_parallel[i].mutex, NULL);
38-
miniomp_parallel[i].fn = fn;
39-
miniomp_parallel[i].fn_data = data;
40-
miniomp_parallel[i].id = i;
41-
pthread_create(&miniomp_threads[i], NULL, worker, &miniomp_parallel[i]);
50+
miniomp_thread_init(&miniomp_threads[i], i, worker, miniomp_parallel);
4251
}
4352
for (int i=0; i < num_threads; i++){
44-
pthread_join(miniomp_threads[i], NULL);
45-
//pthread_mutex_destroy(&miniomp_parallel[i].mutex);
53+
pthread_join(miniomp_threads[i].pthread, NULL);
4654
}
4755
free(miniomp_threads);
4856
free(miniomp_parallel);

src/parallel.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,26 @@
11
#include <pthread.h>
22

33
// Declaration of array for storing pthread identifiers from pthread_create function
4-
extern pthread_t *miniomp_threads;
54

65
// Type declaration for parallel descriptor (arguments needed to create pthreads)
76
typedef struct {
87
void (*fn) (void *);
98
void *fn_data;
10-
int id;
9+
unsigned int id;
1110
pthread_mutex_t mutex;
1211
// complete the definition of parallel descriptor
1312
} miniomp_parallel_t;
1413

1514
typedef struct {
1615
unsigned int id;
17-
} miniomp_parallel_region;
16+
pthread_t pthread;
17+
miniomp_parallel_t *region;
18+
} miniomp_thread_t;
1819

1920
extern miniomp_parallel_t *miniomp_parallel;
20-
21-
// Declaration of per-thread specific key
2221
extern pthread_key_t miniomp_specifickey;
2322

2423
// Functions implemented in this module
24+
void miniomp_parallel_init(miniomp_parallel_t *parallel, void (*fn) (void *), void *data, unsigned int id);
25+
void miniomp_thread_init(miniomp_thread_t * thread, unsigned int id, void (*fn) (void *), miniomp_parallel_t *region);
2526
void GOMP_parallel (void (*fn) (void *), void *data, unsigned num_threads, unsigned int flags);

src/thread.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
#include "thread.h"
2+
#include "libminiomp.h"
23

3-
void miniomp_thread_init(miniomp_thread * thread, unsigned int id, void (*fn) (void *), void *data){
4+
pthread_key_t miniomp_specifickey;
5+
6+
void miniomp_thread_init(miniomp_thread_t * thread, unsigned int id, void (*fn) (void *), void *data){
47
thread->id = id;
8+
thread->region = data;
59
pthread_create(thread->pthread, NULL, fn, data);
10+
pthread_setspecific(miniomp_specifickey, thread);
611
}

src/thread.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
#include <pthread.h>
2-
#include "libminiomp.h"
2+
33

44
typedef struct {
55
unsigned int id;
66
pthread_t pthread;
7-
} miniomp_thread;
7+
struct miniomp_parallel_t *region;
8+
} miniomp_thread_t;
9+
10+
extern pthread_key_t miniomp_specifickey;
811

9-
void miniomp_thread_init(miniomp_thread * thread, unsigned int id);
12+
void miniomp_thread_init(miniomp_thread_t * thread, unsigned int id, void (*fn) (void *), void *data);

test/tparallel.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ int foo() {
88
int i, x = 1023;
99
#pragma omp parallel firstprivate(x) reduction(+:first) if(x>0) num_threads(2)
1010
{
11-
x++;
11+
x++;
1212
first += x;
1313
}
1414

test/tworkshare

6.38 KB
Binary file not shown.

0 commit comments

Comments
 (0)