reformat, following initial convention

This commit is contained in:
Mylloon 2024-04-19 15:33:03 +02:00
parent f95dcaf491
commit 6b891cf338
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
5 changed files with 266 additions and 241 deletions

5
.clang-format Normal file
View file

@ -0,0 +1,5 @@
IndentWidth: 4
InsertBraces: true
BreakBeforeBraces: Linux
AlwaysBreakAfterReturnType: TopLevelDefinitions
SpaceBeforeParens: Never

View file

@ -31,7 +31,9 @@ struct scheduler {
int exit; int exit;
}; };
static inline int sched_default_threads(void) { static inline int
sched_default_threads(void)
{
return sysconf(_SC_NPROCESSORS_ONLN); return sysconf(_SC_NPROCESSORS_ONLN);
} }

View file

@ -1,5 +1,7 @@
#include "../includes/quicksort.h" #include "../includes/quicksort.h"
int main(int argc, char *argv[]) { int
main(int argc, char *argv[])
{
return benchmark(argc, argv); return benchmark(argc, argv);
} }

View file

@ -1,20 +1,22 @@
#include "../includes/quicksort.h" #include "../includes/quicksort.h"
int partition(int *a, int lo, int hi) { int
partition(int *a, int lo, int hi)
{
int pivot = a[lo]; int pivot = a[lo];
int i = lo - 1; int i = lo - 1;
int j = hi + 1; int j = hi + 1;
int t; int t;
while (1) { while(1) {
do { do {
i++; i++;
} while (a[i] < pivot); } while(a[i] < pivot);
do { do {
j--; j--;
} while (a[j] > pivot); } while(a[j] > pivot);
if (i >= j) { if(i >= j) {
return j; return j;
} }
@ -29,9 +31,11 @@ struct quicksort_args {
int lo, hi; int lo, hi;
}; };
struct quicksort_args *new_args(int *a, int lo, int hi) { struct quicksort_args *
new_args(int *a, int lo, int hi)
{
struct quicksort_args *args = malloc(sizeof(struct quicksort_args)); struct quicksort_args *args = malloc(sizeof(struct quicksort_args));
if (args == NULL) { if(args == NULL) {
return NULL; return NULL;
} }
@ -41,10 +45,12 @@ struct quicksort_args *new_args(int *a, int lo, int hi) {
return args; return args;
} }
void quicksort_serial(int *a, int lo, int hi) { void
quicksort_serial(int *a, int lo, int hi)
{
int p; int p;
if (lo >= hi) { if(lo >= hi) {
return; return;
} }
@ -53,7 +59,9 @@ void quicksort_serial(int *a, int lo, int hi) {
quicksort_serial(a, p + 1, hi); quicksort_serial(a, p + 1, hi);
} }
void quicksort(void *closure, struct scheduler *s) { void
quicksort(void *closure, struct scheduler *s)
{
struct quicksort_args *args = (struct quicksort_args *)closure; struct quicksort_args *args = (struct quicksort_args *)closure;
int *a = args->a; int *a = args->a;
int lo = args->lo; int lo = args->lo;
@ -63,11 +71,11 @@ void quicksort(void *closure, struct scheduler *s) {
free(closure); free(closure);
if (lo >= hi) { if(lo >= hi) {
return; return;
} }
if (hi - lo <= 128) { if(hi - lo <= 128) {
quicksort_serial(a, lo, hi); quicksort_serial(a, lo, hi);
return; return;
} }
@ -79,7 +87,9 @@ void quicksort(void *closure, struct scheduler *s) {
assert(rc >= 0); assert(rc >= 0);
} }
int benchmark(int argc, char **argv) { int
benchmark(int argc, char **argv)
{
int *a; int *a;
struct timespec begin, end; struct timespec begin, end;
double delay; double delay;
@ -88,12 +98,12 @@ int benchmark(int argc, char **argv) {
int nthreads = -1; int nthreads = -1;
int serial = 0; int serial = 0;
while (1) { while(1) {
int opt = getopt(argc, argv, "sn:t:"); int opt = getopt(argc, argv, "sn:t:");
if (opt < 0) { if(opt < 0) {
break; break;
} }
switch (opt) { switch(opt) {
case 's': case 's':
serial = 1; serial = 1;
break; break;
@ -108,28 +118,28 @@ int benchmark(int argc, char **argv) {
} }
} }
if (n <= 0) { if(n <= 0) {
goto usage; goto usage;
} }
if (nthreads < 0 && !serial) { if(nthreads < 0 && !serial) {
goto usage; goto usage;
} }
a = malloc(n * sizeof(int)); a = malloc(n * sizeof(int));
unsigned long long s = 0; unsigned long long s = 0;
for (int i = 0; i < n; i++) { for(int i = 0; i < n; i++) {
s = s * 6364136223846793005ULL + 1442695040888963407; s = s * 6364136223846793005ULL + 1442695040888963407;
a[i] = (int)((s >> 33) & 0x7FFFFFFF); a[i] = (int)((s >> 33) & 0x7FFFFFFF);
} }
clock_gettime(CLOCK_MONOTONIC, &begin); clock_gettime(CLOCK_MONOTONIC, &begin);
if (serial) { if(serial) {
quicksort_serial(a, 0, n - 1); quicksort_serial(a, 0, n - 1);
} else { } else {
rc = rc = sched_init(nthreads, (n + 127) / 128, quicksort,
sched_init(nthreads, (n + 127) / 128, quicksort, new_args(a, 0, n - 1)); new_args(a, 0, n - 1));
assert(rc >= 0); assert(rc >= 0);
} }
@ -138,7 +148,7 @@ int benchmark(int argc, char **argv) {
(begin.tv_sec + begin.tv_nsec / 1000000000.0); (begin.tv_sec + begin.tv_nsec / 1000000000.0);
printf("Done in %lf seconds.\n", delay); printf("Done in %lf seconds.\n", delay);
for (int i = 0; i < n - 1; i++) { for(int i = 0; i < n - 1; i++) {
assert(a[i] <= a[i + 1]); assert(a[i] <= a[i + 1]);
} }

View file

@ -6,13 +6,15 @@
static struct scheduler sched; static struct scheduler sched;
/* Lance une tâche de la pile */ /* Lance une tâche de la pile */
void *worker_routine(void *arg) { void *
worker_routine(void *arg)
{
struct scheduler *s = (struct scheduler *)arg; struct scheduler *s = (struct scheduler *)arg;
while (1) { while(1) {
pthread_mutex_lock(&s->mutex); pthread_mutex_lock(&s->mutex);
if (s->exit == 1) { if(s->exit == 1) {
pthread_mutex_unlock(&s->mutex); pthread_mutex_unlock(&s->mutex);
printf("finalement..rien a faire, ciao\n"); printf("finalement..rien a faire, ciao\n");
@ -20,7 +22,7 @@ void *worker_routine(void *arg) {
} }
// S'il on a rien à faire // S'il on a rien à faire
if (s->top == -1) { if(s->top == -1) {
// printf("attend..\n"); // printf("attend..\n");
pthread_cond_wait(&s->cond, &s->mutex); pthread_cond_wait(&s->cond, &s->mutex);
pthread_mutex_unlock(&s->mutex); pthread_mutex_unlock(&s->mutex);
@ -39,7 +41,7 @@ void *worker_routine(void *arg) {
f(closure, s); f(closure, s);
// Signale s'il n'y a plus rien à faire // Signale s'il n'y a plus rien à faire
if (s->top == -1) { if(s->top == -1) {
printf("va falloir partir\n"); printf("va falloir partir\n");
pthread_mutex_lock(&s->mutex); pthread_mutex_lock(&s->mutex);
s->exit = 1; s->exit = 1;
@ -51,8 +53,10 @@ void *worker_routine(void *arg) {
return NULL; return NULL;
} }
int sched_init(int nthreads, int qlen, taskfunc f, void *closure) { int
if (nthreads == 0) { sched_init(int nthreads, int qlen, taskfunc f, void *closure)
{
if(nthreads == 0) {
nthreads = sched_default_threads(); nthreads = sched_default_threads();
} }
@ -63,31 +67,31 @@ int sched_init(int nthreads, int qlen, taskfunc f, void *closure) {
sched.top = -1; sched.top = -1;
sched.exit = 0; sched.exit = 0;
if (pthread_mutex_init(&sched.mutex, NULL) != 0) { if(pthread_mutex_init(&sched.mutex, NULL) != 0) {
fprintf(stderr, "Can't init mutex\n"); fprintf(stderr, "Can't init mutex\n");
return -1; return -1;
} }
if (pthread_cond_init(&sched.cond, NULL) != 0) { if(pthread_cond_init(&sched.cond, NULL) != 0) {
fprintf(stderr, "Can't init condition variable\n"); fprintf(stderr, "Can't init condition variable\n");
return -1; return -1;
} }
pthread_t threads[nthreads]; pthread_t threads[nthreads];
for (int i = 0; i < nthreads; ++i) { for(int i = 0; i < nthreads; ++i) {
if (pthread_create(&threads[i], NULL, worker_routine, &sched) != 0) { if(pthread_create(&threads[i], NULL, worker_routine, &sched) != 0) {
fprintf(stderr, "Can't create threads\n"); fprintf(stderr, "Can't create threads\n");
return -1; return -1;
} }
} }
if (sched_spawn(f, closure, &sched) != 0) { if(sched_spawn(f, closure, &sched) != 0) {
fprintf(stderr, "Can't create the initial task\n"); fprintf(stderr, "Can't create the initial task\n");
return -1; return -1;
} }
for (int i = 0; i < nthreads; ++i) { for(int i = 0; i < nthreads; ++i) {
if ((pthread_join(threads[i], NULL) != 0)) { if((pthread_join(threads[i], NULL) != 0)) {
fprintf(stderr, "Can't wait the thread %d\n", i); fprintf(stderr, "Can't wait the thread %d\n", i);
return -1; return -1;
} }
@ -96,10 +100,12 @@ int sched_init(int nthreads, int qlen, taskfunc f, void *closure) {
return 1; return 1;
} }
int sched_spawn(taskfunc f, void *closure, struct scheduler *s) { int
sched_spawn(taskfunc f, void *closure, struct scheduler *s)
{
pthread_mutex_lock(&s->mutex); pthread_mutex_lock(&s->mutex);
if (s->top + 1 >= MAX_TASKS) { if(s->top + 1 >= MAX_TASKS) {
pthread_mutex_unlock(&s->mutex); pthread_mutex_unlock(&s->mutex);
errno = EAGAIN; errno = EAGAIN;
fprintf(stderr, "Stack is full\n"); fprintf(stderr, "Stack is full\n");