Commit f031cd79 authored by Grégory Mounié's avatar Grégory Mounié

spinlock

Implantation spinlock
ajout du sanitize sur undef behavior
parent b379d224
CXXFLAGS= -std=gnu++11 -Wall -Werror -O3
CXXFLAGS= -std=gnu++11 -Wall -Werror -O3 -Wextra -fsanitize=undefined
CC= g++
LDLIBS+= -lpthread
LDLIBS+= -lpthread -lubsan
CFLAGS+= -Wall -g -O3 -std=gnu11
all: dekker peterson dekkerAvecC11
dekker: dekker.o
dekkerAvecC11: inc.o dekkerC11.o dekkerAvecC11.o
dekkerAvecC11: inc.o dekkerC11.o dekkerAvecC11.o spin.o
dekkerC11.o: CC=gcc
spin.o: CC=gcc
peterson: peterson.o
clean:
rm -f dekker dekker.o peterson peterson.o dekkerC11.o dekkerAvecC11.o inc.o
rm -f dekker dekker.o peterson peterson.o dekkerC11.o dekkerAvecC11.o inc.o spin.o
......@@ -26,6 +26,8 @@ constexpr int NBINC= 10000;
/* marche pas ! */
void incrementeur(int me, int other) {
(void) me;
(void) other;
for(int i=0; i < NBINC; i++) {
compteur++;
}
......@@ -108,6 +110,8 @@ void incrementeur_dekker(int me, int other) {
int main(int argc, char **argv) {
(void) argc;
(void) argv;
cout << u8"** Increm. sans dekker **" << endl;
thread t1 = thread(incrementeur, 0, 1);
thread t2 = thread(incrementeur, 1, 0);
......
......@@ -15,6 +15,7 @@
#include "dekkerC11.h"
#include "inc.h"
#include "spin.h"
using namespace std;
......@@ -114,6 +115,8 @@ atomic_int acompteur;
int main(int argc, char **argv) {
(void) argc;
(void) argv;
cout << u8"** Increm. sans dekker **" << endl;
auto d = chrono::high_resolution_clock::now();
thread t1 = thread(incrementeur, 0, 1, (int*) &compteur, 0);
......@@ -153,7 +156,7 @@ int main(int argc, char **argv) {
cout << compteur << "/" << NBINC * 2 << " en "
<< chrono::duration_cast<chrono::nanoseconds>(e-d).count() << " ns" << endl;
cout << u8"** Increm dekker + atomic var + modele memoire **" << endl;
cout << u8"** Increm dekker C11 + atomic var + modele memoire **" << endl;
d = chrono::high_resolution_clock::now();
compteur = 0;
......@@ -167,12 +170,13 @@ int main(int argc, char **argv) {
cout << compteur << "/" << NBINC * 2 << " en "
<< chrono::duration_cast<chrono::nanoseconds>(e-d).count() << " ns" << endl;
cout << u8"** Increm avec opération atomiques **" << endl;
cout << u8"** Increm pthread spinlock **" << endl;
d = chrono::high_resolution_clock::now();
acompteur = 0;
thread t9 = thread(incrementeur_atomic, 0, 1, &acompteur, 0);
thread t10 = thread(incrementeur_atomic, 1, 0, &acompteur, 0);
compteur = 0;
spin_init();
thread t9 = thread(incrementeur_dekker_spin, 0, 1);
thread t10 = thread(incrementeur_dekker_spin, 1, 0);
t9.join();
t10.join();
......@@ -181,4 +185,19 @@ int main(int argc, char **argv) {
cout << compteur << "/" << NBINC * 2 << " en "
<< chrono::duration_cast<chrono::nanoseconds>(e-d).count() << " ns" << endl;
cout << u8"** Increm avec opération atomiques **" << endl;
d = chrono::high_resolution_clock::now();
acompteur = 0;
thread t11 = thread(incrementeur_atomic, 0, 1, &acompteur, 0);
thread t12 = thread(incrementeur_atomic, 1, 0, &acompteur, 0);
t11.join();
t12.join();
e = chrono::high_resolution_clock::now();
cout << compteur << "/" << NBINC * 2 << " en "
<< chrono::duration_cast<chrono::nanoseconds>(e-d).count() << " ns" << endl;
}
......@@ -12,12 +12,16 @@ volatile int compteur = 0;
/* marche pas ! */
void incrementeur(int me, int other, int *compteur, int stride) {
(void) me;
(void) other;
for(int i=0; i < NBINC; i++) {
(*(compteur+i*stride))++;
}
}
void incrementeur_atomic(int me, int other, atomic_int *compteur, int stride) {
(void) me;
(void) other;
for(int i=0; i < NBINC; i++) {
(*(compteur+i*stride))++;
}
......
......@@ -26,6 +26,8 @@ constexpr int NBINC= 10000;
/* marche pas ! */
void incrementeur(int me, int other) {
(void) me;
(void) other;
for(int i=0; i < NBINC; i++) {
compteur++;
}
......@@ -46,6 +48,8 @@ void fdebut_sc(int me, int other) {
}
void ffin_sc(int me, int other) {
(void) me;
(void) other;
fdemande[me] = false;
}
......@@ -73,6 +77,8 @@ void debut_sc(int me, int other) {
}
void fin_sc(int me, int other) {
(void) me;
(void) other;
demande[me] = false;
}
......@@ -88,6 +94,8 @@ void incrementeur_peterson(int me, int other) {
int main(int argc, char **argv) {
(void) argc;
(void) argv;
cout << u8"** Increm. sans Peterson **" << endl;
thread t1 = thread(incrementeur, 0, 1);
thread t2 = thread(incrementeur, 1, 0);
......
/*****************************************************
* Copyright Grégory Mounié 2015-2019 *
* This code is distributed under the GLPv3+ licence.*
* Ce code est distribué sous la licence GPLv3+. *
*****************************************************/
/* Implantation spin lock */
/* Verification du fonctionnement
sur l'incrementation d'une variable
entière non atomique (mais volatile) */
#include <pthread.h>
#include <stdbool.h>
#include "spin.h"
// attention à mettre la même valeur en C et C++
#define NBINC 400000
extern volatile int compteur;
/* Spin lock */
/* Lire la section NOTES du man de pthread_spin_init pour comprendre
* que le choix de cette famille de fonctions est mauvais en règle
* générale */
pthread_spinlock_t splock;
void spin_init() {
pthread_spin_init(& splock, PTHREAD_PROCESS_PRIVATE);
}
void debut_sc_spin(int me, int other) {
(void) me;
(void) other;
pthread_spin_lock(& splock);
}
void fin_sc_spin(int me, int other) {
(void) me;
(void) other;
pthread_spin_unlock(& splock);
}
void incrementeur_dekker_spin(int me, int other) {
for(int i=0; i < NBINC; i++) {
debut_sc_spin(me, other);
compteur++;
fin_sc_spin(me, other);
}
}
/*****************************************************
* Copyright Grégory Mounié 2015-2019 *
* This code is distributed under the GLPv3+ licence.*
* Ce code est distribué sous la licence GPLv3+. *
*****************************************************/
/* Implantation spinlock en pthread */
#ifdef __cplusplus
extern "C" {
#endif
extern volatile int compteur;
void spin_init();
void debut_sc_spin(int me, int other);
void fin_sc_spin(int me, int other);
void incrementeur_dekker_spin(int me, int other);
#ifdef __cplusplus
}
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment