add sched.h and quicksort.h, alongs with template for report, makefiles and basic readme
This commit is contained in:
commit
1ba60ab73d
11 changed files with 332 additions and 0 deletions
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
|
@ -0,0 +1,6 @@
|
|||
*.o
|
||||
*.out
|
||||
|
||||
*.pdf
|
||||
|
||||
*.tar
|
54
Makefile
Normal file
54
Makefile
Normal file
|
@ -0,0 +1,54 @@
|
|||
CC = gcc
|
||||
RM = rm -r
|
||||
TAR = tar -cf
|
||||
CP = cp -r
|
||||
MKDIR = mkdir -p
|
||||
|
||||
SRC_DIR = src
|
||||
INC_DIR = includes
|
||||
SOURCES = $(wildcard $(SRC_DIR)/*.c)
|
||||
OBJETS = $(patsubst %.c,%.o,$(notdir $(SOURCES)))
|
||||
|
||||
CFLAGS = -std=gnu11 -pedantic
|
||||
LDFLAGS =
|
||||
|
||||
EXE = projet
|
||||
EXE_EXT = out
|
||||
|
||||
ARCHIVE = kennel
|
||||
PDF_DIR = report
|
||||
|
||||
%.o: src/%.c
|
||||
$(CC) -c $< -o $@ $(CFLAGS)
|
||||
|
||||
compilation: $(OBJETS)
|
||||
$(CC) -o $(EXE).$(EXE_EXT) $(OBJETS) $(LDFLAGS)
|
||||
|
||||
main: CFLAGS += -O3
|
||||
main: compilation
|
||||
|
||||
dev: CFLAGS += -Wall -Wextra -Wshadow -Wcast-align -Wstrict-prototypes
|
||||
dev: CFLAGS += -fanalyzer -fsanitize=undefined -g -Og
|
||||
dev: LDFLAGS += -fsanitize=undefined
|
||||
dev: compilation
|
||||
|
||||
all:
|
||||
main
|
||||
|
||||
pdf-make:
|
||||
cd report && \
|
||||
$(MAKE)
|
||||
|
||||
pdf-clean:
|
||||
cd report && \
|
||||
$(MAKE) clean
|
||||
|
||||
clean: pdf-clean
|
||||
-$(RM) $(OBJETS) "$(EXE).$(EXE_EXT)" "$(ARCHIVE).tar"
|
||||
|
||||
archive: pdf-make
|
||||
$(MKDIR) "$(ARCHIVE)"
|
||||
$(CP) "$(SRC_DIR)" "$(INC_DIR)" Makefile README \
|
||||
"$(wildcard $(PDF_DIR)/*.pdf)" "$(ARCHIVE)"
|
||||
$(TAR) "$(ARCHIVE).tar" "$(ARCHIVE)"
|
||||
$(RM) "$(ARCHIVE)"
|
19
README
Normal file
19
README
Normal file
|
@ -0,0 +1,19 @@
|
|||
Projet de programmation système avancée
|
||||
=======================================
|
||||
|
||||
Compilation
|
||||
-----------
|
||||
|
||||
make
|
||||
|
||||
Ce qui créer l'exécutable `projet.out`.
|
||||
|
||||
Lancement
|
||||
---------
|
||||
|
||||
./projet.out
|
||||
|
||||
Info
|
||||
----
|
||||
|
||||
Anri Kennel 22302653
|
11
includes/quicksort.h
Normal file
11
includes/quicksort.h
Normal file
|
@ -0,0 +1,11 @@
|
|||
#pragma once
|
||||
|
||||
#include "sched.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
int benchmark(int argc, char **argv);
|
28
includes/sched.h
Normal file
28
includes/sched.h
Normal file
|
@ -0,0 +1,28 @@
|
|||
#pragma once
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
struct scheduler;
|
||||
|
||||
typedef void (*taskfunc)(void *, struct scheduler *);
|
||||
|
||||
static inline int sched_default_threads() {
|
||||
return sysconf(_SC_NPROCESSORS_ONLN);
|
||||
}
|
||||
|
||||
/* Lance l'ordonnanceur
|
||||
* - nthreads : nombre de threads créer par l'ordonnanceur
|
||||
* Si 0, le nombre de threads sera égal au nombre de coeurs de votre machine
|
||||
*
|
||||
* - qlen : nombre minimum de tâches simultanées que l’ordonnanceur devra
|
||||
* supporter
|
||||
* Retourne une erreur si l'utilisateur dépasse qlen
|
||||
*
|
||||
* - f, closure : tâche initiale
|
||||
*
|
||||
* Renvoie 1 quand elle a terminé, -1 en cas d'échec d'initialisation
|
||||
*/
|
||||
int sched_init(int nthreads, int qlen, taskfunc f, void *closure);
|
||||
|
||||
/* Enfile une nouvelle tâche (f, closure) à l'ordonanceur (s) */
|
||||
int sched_spawn(taskfunc f, void *closure, struct scheduler *s);
|
5
report/.gitignore
vendored
Normal file
5
report/.gitignore
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
*
|
||||
|
||||
!.gitignore
|
||||
!Makefile
|
||||
!*.tex
|
16
report/Makefile
Normal file
16
report/Makefile
Normal file
|
@ -0,0 +1,16 @@
|
|||
NAME = document
|
||||
|
||||
TEX = $(NAME).tex
|
||||
SRC = $(TEX)
|
||||
PDF = $(TEX:.tex=.pdf)
|
||||
|
||||
TEXMK = latexmk -shell-escape -lualatex
|
||||
|
||||
all: $(PDF)
|
||||
|
||||
$(PDF): %.pdf: %.tex
|
||||
$(TEXMK) $<
|
||||
|
||||
EXTS = aux fdb_latexmk fls log nav out snm synctex.gz toc
|
||||
clean:
|
||||
rm -rf $(PDF) _minted-$(NAME)/ $(foreach ext,$(EXTS),$(NAME).$(ext))
|
37
report/document.tex
Normal file
37
report/document.tex
Normal file
|
@ -0,0 +1,37 @@
|
|||
\documentclass{article}
|
||||
|
||||
\usepackage[T1]{fontenc} % encoding
|
||||
\renewcommand{\familydefault}{\sfdefault} % sans-serif font
|
||||
|
||||
\usepackage[french]{babel} % langages
|
||||
\frenchsetup{SmallCapsFigTabCaptions=false}
|
||||
|
||||
\newcommand{\anri}{Anri Kennel}
|
||||
|
||||
\newcommand{\settitle}{Projet}
|
||||
|
||||
\usepackage[
|
||||
pdfauthor={\anri}, % author metadata
|
||||
pdftitle={\settitle}, % title metadata
|
||||
hidelinks, % clickable links in table of contents
|
||||
]{hyperref}
|
||||
|
||||
\title{\settitle}
|
||||
|
||||
\title{Projet}
|
||||
\author{\anri\thanks{\anri : 22302653} \\
|
||||
Programmation système avancée $\cdot$ Université Paris Cité}
|
||||
\date{Année universitaire 2023-2024}
|
||||
|
||||
\begin{document}
|
||||
\maketitle
|
||||
\tableofcontents
|
||||
\clearpage
|
||||
|
||||
\section{Description}
|
||||
\dots
|
||||
|
||||
\section{Statistiques}
|
||||
\dots
|
||||
|
||||
\end{document}
|
5
src/main.c
Normal file
5
src/main.c
Normal file
|
@ -0,0 +1,5 @@
|
|||
#include "../includes/quicksort.h"
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
return benchmark(argc, argv);
|
||||
}
|
150
src/quicksort.c
Normal file
150
src/quicksort.c
Normal file
|
@ -0,0 +1,150 @@
|
|||
#include "../includes/quicksort.h"
|
||||
|
||||
int partition(int *a, int lo, int hi) {
|
||||
int pivot = a[lo];
|
||||
int i = lo - 1;
|
||||
int j = hi + 1;
|
||||
int t;
|
||||
while (1) {
|
||||
do {
|
||||
i++;
|
||||
} while (a[i] < pivot);
|
||||
|
||||
do {
|
||||
j--;
|
||||
} while (a[j] > pivot);
|
||||
|
||||
if (i >= j) {
|
||||
return j;
|
||||
}
|
||||
|
||||
t = a[i];
|
||||
a[i] = a[j];
|
||||
a[j] = t;
|
||||
}
|
||||
}
|
||||
|
||||
struct quicksort_args {
|
||||
int *a;
|
||||
int lo, hi;
|
||||
};
|
||||
|
||||
struct quicksort_args *new_args(int *a, int lo, int hi) {
|
||||
struct quicksort_args *args = malloc(sizeof(struct quicksort_args));
|
||||
if (args == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
args->a = a;
|
||||
args->lo = lo;
|
||||
args->hi = hi;
|
||||
return args;
|
||||
}
|
||||
|
||||
void quicksort_serial(int *a, int lo, int hi) {
|
||||
int p;
|
||||
|
||||
if (lo >= hi) {
|
||||
return;
|
||||
}
|
||||
|
||||
p = partition(a, lo, hi);
|
||||
quicksort_serial(a, lo, p);
|
||||
quicksort_serial(a, p + 1, hi);
|
||||
}
|
||||
|
||||
void quicksort(void *closure, struct scheduler *s) {
|
||||
struct quicksort_args *args = (struct quicksort_args *)closure;
|
||||
int *a = args->a;
|
||||
int lo = args->lo;
|
||||
int hi = args->hi;
|
||||
int p;
|
||||
int rc;
|
||||
|
||||
free(closure);
|
||||
|
||||
if (lo >= hi) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (hi - lo <= 128) {
|
||||
quicksort_serial(a, lo, hi);
|
||||
return;
|
||||
}
|
||||
|
||||
p = partition(a, lo, hi);
|
||||
rc = sched_spawn(quicksort, new_args(a, lo, p), s);
|
||||
assert(rc >= 0);
|
||||
rc = sched_spawn(quicksort, new_args(a, p + 1, hi), s);
|
||||
assert(rc >= 0);
|
||||
}
|
||||
|
||||
int benchmark(int argc, char **argv) {
|
||||
int *a;
|
||||
struct timespec begin, end;
|
||||
double delay;
|
||||
int rc;
|
||||
int n = 10 * 1024 * 1024;
|
||||
int nthreads = -1;
|
||||
int serial = 0;
|
||||
|
||||
while (1) {
|
||||
int opt = getopt(argc, argv, "sn:t:");
|
||||
if (opt < 0) {
|
||||
break;
|
||||
}
|
||||
switch (opt) {
|
||||
case 's':
|
||||
serial = 1;
|
||||
break;
|
||||
case 'n':
|
||||
n = atoi(optarg);
|
||||
if (n <= 0) {
|
||||
goto usage;
|
||||
}
|
||||
break;
|
||||
case 't':
|
||||
nthreads = atoi(optarg);
|
||||
if (nthreads <= 0) {
|
||||
goto usage;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
goto usage;
|
||||
}
|
||||
}
|
||||
|
||||
a = malloc(n * sizeof(int));
|
||||
|
||||
unsigned long long s = 0;
|
||||
for (int i = 0; i < n; i++) {
|
||||
s = s * 6364136223846793005ULL + 1442695040888963407;
|
||||
a[i] = (int)((s >> 33) & 0x7FFFFFFF);
|
||||
}
|
||||
|
||||
clock_gettime(CLOCK_MONOTONIC, &begin);
|
||||
|
||||
if (serial) {
|
||||
quicksort_serial(a, 0, n - 1);
|
||||
} else {
|
||||
rc =
|
||||
sched_init(nthreads, (n + 127) / 128, quicksort, new_args(a, 0, n - 1));
|
||||
assert(rc >= 0);
|
||||
}
|
||||
|
||||
clock_gettime(CLOCK_MONOTONIC, &end);
|
||||
delay = end.tv_sec + end.tv_nsec / 1000000000.0 -
|
||||
(begin.tv_sec + begin.tv_nsec / 1000000000.0);
|
||||
printf("Done in %lf seconds.\n", delay);
|
||||
|
||||
for (int i = 0; i < n - 1; i++) {
|
||||
assert(a[i] <= a[i + 1]);
|
||||
}
|
||||
|
||||
free(a);
|
||||
return 0;
|
||||
|
||||
usage:
|
||||
printf("quicksort [-n size] [-t threads] [-s]\n");
|
||||
return 1;
|
||||
}
|
1
src/sched.c
Normal file
1
src/sched.c
Normal file
|
@ -0,0 +1 @@
|
|||
#include "../includes/sched.h"
|
Reference in a new issue