parsort_init.c
/*****************************************************************/
/* */
/* Tri parallèle pair / impair en MPI */
/* */
/*****************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <mpi.h>
#include <string.h>
#define MAX_SIZE 40
#define LOGIN_SIZE 9 /* les chaînes sont AZT donc il vaut mieux un caractère de plus... */
#define BUFFER_LEN 256
#define ODD 666
#define EVEN 667
typedef struct {
char login[LOGIN_SIZE];
int uid;
int gid;
char name[MAX_SIZE];
} identifiant_t;
MPI_Datatype MPI_IDENTIFIANT_T;
int my_id, nb_proc;
void affiche(identifiant_t tab[], int nb)
{
int i;
for(i=0 ; i<nb ; i++)
printf("%s %d %d %s\n",
tab[i].login,
tab[i].uid,
tab[i].gid,
tab[i].name);
}
void affiche_local(int tag,identifiant_t tab[], int nb)
{
int i;
printf("\t P%d, étape %d\t", my_id,tag);
for(i=0 ; i<nb; i++)
printf("%d ",tab[i].uid);
printf("\n");
fflush(stdout);
}
int compare_uid(const void *a, const void *b)
{
if(((identifiant_t *)a)->uid < ((identifiant_t *)b)->uid) return -1;
else if(((identifiant_t *)a)->uid ==((identifiant_t *)b)->uid) return 0;
else return 1;
}
void begin_odd(identifiant_t *tab, int taille)
{
}
void begin_even(identifiant_t *tab, int taille)
{
}
void end_odd(identifiant_t *tab, int taille)
{
}
void end_even(identifiant_t *tab, int taille)
{
}
void odd_even(identifiant_t *tab, int taille)
{
}
void mpi_types_initialize()
{
}
void parse(char *filename, identifiant_t *tab[], int *nb)
{
FILE *input=fopen(filename,"r");
char buffer[BUFFER_LEN];
char *login;
char *uid;
char *gid;
char *name;
int i=0;
if (!input) {
fprintf(stderr,"Erreur d'ouverture de %s\n",filename);
exit(1);
}
fgets(buffer,BUFFER_LEN,input);
sscanf(buffer,"%d",nb);
*tab=calloc(*nb,sizeof(identifiant_t));
while (fgets(buffer,BUFFER_LEN,input))
{
login = strtok(buffer,"|\n");
uid = strtok(NULL,"|\n");
gid = strtok(NULL,"|\n");
name = strtok(NULL,"|\n");
strcpy((*tab)[i].login,login);
(*tab)[i].uid = atoi(uid);
(*tab)[i].gid = atoi(gid);
strcpy((*tab)[i].name,name);
i++;
}
}
int main(int argc, char **argv)
{
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&nb_proc);
MPI_Comm_rank(MPI_COMM_WORLD,&my_id);
/* printf("Je suis le processus P%d et nous sommes %d au total.\n", */
/* my_id, nb_proc); */
mpi_types_initialize();
{
identifiant_t *tab;
identifiant_t *to_sort;
int nb,taille;
if(my_id==0) parse(argv[1],&tab,&nb);
MPI_Bcast(&nb, 1, MPI_INT, 0, MPI_COMM_WORLD);
taille = nb/nb_proc;
to_sort=calloc(2*(taille),sizeof(identifiant_t));
/* Distribuer les données */
odd_even(to_sort,taille);
/* Regrouper les données */
if(my_id==0) affiche(tab,taille*nb_proc);
}
MPI_Finalize();
return (0);
}
Generated by GNU enscript 1.6.2.