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.