Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[smpi,example] an example of matrix multiplication with non contignous memory
[simgrid.git] / examples / smpi / MM / MM_mpi.c
diff --git a/examples/smpi/MM/MM_mpi.c b/examples/smpi/MM/MM_mpi.c
new file mode 100644 (file)
index 0000000..7ab7d14
--- /dev/null
@@ -0,0 +1,178 @@
+/*
+ * Block Matrix Multiplication example
+ *
+ * Authors: Quintin Jean-Noël
+ */
+
+
+#include "topo.h"
+#include "param.h"
+#include "Matrix_init.h"
+#include "2.5D_MM.h"
+#include "xbt/log.h"
+
+/*int sched_setaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);
+  int sched_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);
+ */
+#include <mpi.h>
+#include <math.h>
+#include <getopt.h>
+#include <stdio.h>
+#include <string.h>
+
+ XBT_LOG_NEW_DEFAULT_CATEGORY(MM_mpi,
+                             "Messages specific for this msg example");
+
+
+
+int main(int argc, char ** argv)
+{
+
+  size_t    m   = 1024 , n   = 1024 , k = 1024;
+  size_t    NB_Block = 16;
+  size_t    Block_size = k/NB_Block ;
+  size_t    NB_groups = 1, group = 0, key = 0;
+  /* x index on M
+     y index on N
+     Z index on K */
+
+
+
+  int myrank;
+  int NB_proc;
+  size_t row, col, size_row, size_col; //description: vitual processor topology
+  row = 0;
+  col = 0;
+
+  MPI_Init(&argc, &argv);
+
+  /* Find out my identity in the default communicator */
+
+  MPI_Comm_rank ( MPI_COMM_WORLD, &myrank );
+  MPI_Comm_size ( MPI_COMM_WORLD, &NB_proc );
+
+  if(NB_proc != 1)
+    for (size_col=NB_proc/2; NB_proc%size_col; size_col--);
+  else
+    size_col = 1;
+
+  size_row = NB_proc/size_col;
+  if (size_row > size_col){
+    size_col = size_row;
+    size_row = NB_proc/size_col;
+  }
+
+
+  // for the degub
+#if DEBUG_MPI
+  size_t loop=1;
+  while(loop==1);
+#endif
+
+  int opt, display = 0;
+  char *conf_file = NULL;
+  optind = 1;
+
+  //get the parameter from command line
+  while ((opt = getopt(argc, argv, "hdf:r:c:M:N:K:B:G:g:k:P:")) != -1) {
+    switch(opt) {
+      case 'h':
+        XBT_INFO(
+                    "Usage: mxm_cblas_test [options]\n"
+                    "  -M I    M size (default: %zu)\n"
+                    "  -N I    N size (default: %zu)\n"
+                    "  -K I    K size (default: %zu)\n"
+                    "  -B I    Block size on the k dimension(default: %zu)\n"
+                    "  -G I    Number of processor groups(default: %zu)\n"
+                    "  -g I    group index(default: %zu)\n"
+                    "  -k I    group rank(default: %zu)\n"
+                    "  -r I    processor row size (default: %zu)\n"
+                    "  -c I    processor col size (default: %zu)\n"
+                    " -f {Filename} provide the file with the configuration\n"
+                    "  -d  display the configuration file on the stderr\n"
+                    "  -h      help\n",
+                    m, n, k, Block_size, NB_groups, group, key, row, col);
+        return 0;
+      case 'M':
+        m = atoi(optarg);
+        break;
+      case 'N':
+        n   = atoi(optarg);
+        break;
+      case 'K':
+        k  = atoi(optarg);
+        break;
+      case 'B':
+        Block_size = atoi(optarg);
+        break;
+      case 'G':
+        NB_groups = atoi(optarg);
+        break;
+      case 'g':
+        group = atoi(optarg);
+        break;
+      case 'k':
+        key = atoi(optarg);
+        break;
+      case 'r':
+        size_row = atoi(optarg);
+        break;
+      case 'c':
+        size_col = atoi(optarg);
+        break;
+        /*case 'P':
+          str_mask = strdup(optarg);
+          break;*/
+      case 'f':
+        conf_file = strdup(optarg);
+        break;
+      case 'd':
+        display = 1;
+        break;
+    }
+  }
+  if( display == 1 ){
+    print_conf(MPI_COMM_WORLD, myrank,NULL,NULL);
+    MPI_Barrier(MPI_COMM_WORLD);
+    MPI_Finalize();
+    exit(0);
+  }
+
+  char **conf;
+  //char ***conf_all;
+  if(conf_file == NULL){
+    conf = get_conf(MPI_COMM_WORLD, "default_conf", -1);
+  }else{
+    conf = get_conf(MPI_COMM_WORLD, conf_file, -1);
+    //conf_all = get_conf_all(conf_file);
+  }
+  if(conf == NULL){
+        XBT_INFO(
+                "No configuration for me inside the file\n");
+  }else{
+
+
+    if(NB_groups !=1){
+      /* Get my group number from the config file */
+      group = (size_t)atoi(conf[4]);
+    }
+  }
+
+
+
+
+
+
+  // Defined the device if we use the GPU
+  //TODO explain parameters
+
+
+  two_dot_five( m, k, n, Block_size, group, key,
+               size_row, size_col,  NB_groups);
+
+  // close properly the pragram
+end:
+  MPI_Barrier(MPI_COMM_WORLD);
+  MPI_Finalize();
+  return 0;
+}