histo.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #include "Matrix.xmptype.h"
  2. #include <math.h>
  3. #include <mpi.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <unistd.h> // for usleep
  7. #include <xmp.h>
  8. #pragma xmp nodes p(1)
  9. #pragma xmp template t[ : ]
  10. #pragma xmp distribute t(block) onto p
  11. float *data_in;
  12. #pragma xmp align data_in[i] with t(i)
  13. #pragma xmp shadow data_in[*]
  14. int *data_out;
  15. void calcule_histo(float *data, int rows) {
  16. #pragma xmp loop on t(i)
  17. for (int i = 0; i < rows; i++) {
  18. int j = (int)data[i];
  19. if ((j >= 0) && (j < 20)) {
  20. data_out[j]++;
  21. }
  22. }
  23. }
  24. int main(int argc, char **argv) {
  25. xmp_init_mpi(&argc, &argv);
  26. FILE *file = fopen("input.txt", "r");
  27. if (file == NULL) {
  28. fprintf(stderr, "Erreur : impossible d'ouvrir le fichier d'entree\n");
  29. return 1;
  30. }
  31. // Lecture du nombre d'observations
  32. int rows;
  33. fscanf(file, "%d", &rows);
  34. fprintf(stderr, "rows %d\n", rows);
  35. #pragma xmp template_fix t[rows]
  36. data_in = xmp_malloc(xmp_desc_of(data_in), rows);
  37. data_out = (int *)malloc(20 * sizeof(int));
  38. if (data_in == NULL) {
  39. fprintf(stderr, "Erreur : impossible d'allouer la memoire pour le vecteur "
  40. "de donnees\n");
  41. return 1;
  42. }
  43. // Lecture des données du fichier
  44. for (int i = 0; i < rows; i++) {
  45. float a;
  46. fscanf(file, "%f,", &a);
  47. data_in[i] = a;
  48. }
  49. fclose(file);
  50. char *processor_name = malloc(256 * sizeof(char));
  51. int name_len;
  52. MPI_Get_processor_name(processor_name, &name_len);
  53. fprintf(stderr, "\ndebut traitement \nProcesseur %d - Nom : %s \n",
  54. xmpc_node_num(), processor_name);
  55. MPI_Barrier(MPI_COMM_WORLD);
  56. // Calcul de l'histogramme
  57. calcule_histo(data_in, rows);
  58. MPI_Barrier(MPI_COMM_WORLD);
  59. usleep(100);
  60. // Écriture de l'histogramme
  61. // Ouverture du fichier de sortie
  62. char buffer[100];
  63. sprintf(buffer, "output.txt.%i", xmpc_node_num());
  64. FILE *output_file = fopen(buffer, "w");
  65. if (output_file == NULL) {
  66. printf("Erreur : impossible d'ouvrir le fichier de sortie\n");
  67. return 1;
  68. }
  69. for (int i = 0; i < 20; i++) {
  70. fprintf(output_file, "%u ", i);
  71. }
  72. fprintf(output_file, "\n");
  73. for (int i = 0; i < 20; i++) {
  74. fprintf(output_file, "%u ", data_out[i]);
  75. }
  76. fprintf(output_file, "\n");
  77. fclose(output_file);
  78. MPI_Barrier(MPI_COMM_WORLD);
  79. usleep(100);
  80. // Libération de la mémoire
  81. free(data_in);
  82. free(data_out);
  83. fprintf(stderr, "\nfin traitement \nProcesseur %d - Nom : %s \n",
  84. xmpc_node_num(), processor_name);
  85. free(processor_name);
  86. xmp_finalize_mpi();
  87. return 0;
  88. }