Vous êtes sur la page 1sur 3

Pour répondre aux exigences de l'évaluation pratique du cours de Systèmes d'exploitation

(INF261), nous allons fournir des codes pour les deux programmes demandés : un
programme séquentiel pour le calcul du produit scalaire et un programme parallèle utilisant
des threads. De plus, nous inclurons un exemple de Makefile pour compiler et générer les
exécutables.

### Programme Séquentiel de Calcul du Produit Scalaire :

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {


if(argc != 2) {
printf("Usage: %s <tailleVect>\n", argv[0]);
return 1;
}

int tailleVect = atoi(argv[1]);


double *vecteur1 = (double *)malloc(tailleVect * sizeof(double));
double *vecteur2 = (double *)malloc(tailleVect * sizeof(double));

// Initialisation des vecteurs (à remplir selon le besoin)

double produitScalaire = 0.0;


for(int i = 0; i < tailleVect; i++) {
produitScalaire += vecteur1[i] * vecteur2[i];
}

printf("Le produit scalaire des deux vecteurs est : %.2f\n", produitScalaire);

free(vecteur1);
free(vecteur2);

return 0;
}

### Programme Parallèle de Calcul du Produit Scalaire à l'aide des Threads :

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

typedef struct {
double *vecteur1;
double *vecteur2;
int debut;
int fin;
double resultat;
} ThreadArg;

void *calculPartiel(void *arg) {


ThreadArg *targ = (ThreadArg *)arg;
targ->resultat = 0.0;

for(int i = targ->debut; i < targ->fin; i++) {


targ->resultat += targ->vecteur1[i] * targ->vecteur2[i];
}

pthread_exit(NULL);
}

int main(int argc, char *argv[]) {


if(argc != 3) {
printf("Usage: %s <tailleVect> <nbThread>\n", argv[0]);
return 1;
}

int tailleVect = atoi(argv[1]);


int nbThread = atoi(argv[2]);

pthread_t threads[nbThread];
ThreadArg targs[nbThread];
double *vecteur1 = (double *)malloc(tailleVect * sizeof(double));
double *vecteur2 = (double *)malloc(tailleVect * sizeof(double);

// Initialisation des vecteurs (à remplir selon le besoin)

int range = tailleVect / nbThread;


for(int i = 0; i < nbThread; i++) {
targs[i].vecteur1 = vecteur1;
targs[i].vecteur2 = vecteur2;
targs[i].debut = i * range;
targs[i].fin = (i == nbThread - 1) ? tailleVect : (i + 1) * range;

pthread_create(&threads[i], NULL, calculPartiel, (void *)&targs[i]);


}

double produitScalaire = 0.0;


for(int i = 0; i < nbThread; i++) {
pthread_join(threads[i], NULL);
produitScalaire += targs[i].resultat;
}

printf("Le produit scalaire des deux vecteurs est : %.2f\n", produitScalaire);


free(vecteur1);
free(vecteur2);

return 0;
}

### Makefile :
CC = gcc
CFLAGS = -Wall

all: seq parallele

seq: seq.c
$(CC) $(CFLAGS) -o seq seq.c -lm

parallele: parallele.c
$(CC) $(CFLAGS) -o parallele parallele.c -lpthread -lm

clean:
rm -f seq parallele

Ce Makefile permet de compiler le programme séquentiel et le programme parallèle en


utilisant les commandes make seq et make parallele, respectivement. Il est également
possible d'utiliser make clean pour supprimer les fichiers exécutables générés.

Vous aimerez peut-être aussi