浏览代码

fix data distribution of MPI stencil

Samuel Thibault 13 年之前
父节点
当前提交
d53251b5e2
共有 2 个文件被更改,包括 24 次插入18 次删除
  1. 13 6
      doc/starpu.texi
  2. 11 12
      mpi/examples/stencil/stencil5.c

+ 13 - 6
doc/starpu.texi

@@ -2517,10 +2517,16 @@ be given to StarPU by calling @code{starpu_data_set_rank}.
 @smallexample
 /* Returns the MPI node number where data is */
 int my_distrib(int x, int y, int nb_nodes) @{
-	/* Cyclic distrib */
-	return ((int)(x / sqrt(nb_nodes) + (y / sqrt(nb_nodes)) * sqrt(nb_nodes))) % nb_nodes;
-        //	/* Linear distrib */
-        //	return x / sqrt(nb_nodes) + (y / sqrt(nb_nodes)) * X;
+  /* Block distrib */
+  return ((int)(x / sqrt(nb_nodes) + (y / sqrt(nb_nodes)) * sqrt(nb_nodes))) % nb_nodes;
+
+  // /* Other examples useful for other kinds of computations */
+  // /* / distrib */
+  // return (x+y) % nb_nodes;
+
+  // /* Block cyclic distrib */
+  // unsigned side = sqrt(nb_nodes);
+  // return x % side + (y % side) * size;
 @}
 @end smallexample
 @end cartouche
@@ -2542,11 +2548,12 @@ data which will be needed by the tasks that we will execute.
     for(x = 0; x < X; x++) @{
         for (y = 0; y < Y; y++) @{
             int mpi_rank = my_distrib(x, y, size);
-             if (mpi_rank == rank)
+             if (mpi_rank == my_rank)
                 /* Owning data */
                 starpu_variable_data_register(&data_handles[x][y], 0,
                                               (uintptr_t)&(matrix[x][y]), sizeof(unsigned));
-            else if (rank == mpi_rank+1 || rank == mpi_rank-1)
+            else if (my_rank == my_distrib(x+1, y, size) || my_rank == my_distrib(x-1, y, size)
+                  || my_rank == my_distrib(x, y+1, size) || my_rank == my_distrib(x, y-1, size))
                 /* I don't own that index, but will need it for my computations */
                 starpu_variable_data_register(&data_handles[x][y], -1,
                                               (uintptr_t)NULL, sizeof(unsigned));

+ 11 - 12
mpi/examples/stencil/stencil5.c

@@ -44,10 +44,8 @@ int niter = NITER_DEF;
 
 /* Returns the MPI node number where data indexes index is */
 int my_distrib(int x, int y, int nb_nodes) {
-	/* Cyclic distrib */
+	/* Block distrib */
 	return ((int)(x / sqrt(nb_nodes) + (y / sqrt(nb_nodes)) * sqrt(nb_nodes))) % nb_nodes;
-        //	/* Linear distrib */
-        //	return x / sqrt(nb_nodes) + (y / sqrt(nb_nodes)) * X;
 }
 
 
@@ -67,18 +65,18 @@ static void parse_args(int argc, char **argv)
 
 int main(int argc, char **argv)
 {
-        int rank, size, x, y, loop;
+        int my_rank, size, x, y, loop;
         int value=0, mean=0;
         unsigned matrix[X][Y];
         starpu_data_handle data_handles[X][Y];
 
 	starpu_init(NULL);
-	starpu_mpi_initialize_extended(&rank, &size);
+	starpu_mpi_initialize_extended(&my_rank, &size);
         parse_args(argc, argv);
 
         for(x = 0; x < X; x++) {
                 for (y = 0; y < Y; y++) {
-                        matrix[x][y] = (rank+1)*10 + value;
+                        matrix[x][y] = (my_rank+1)*10 + value;
                         value++;
                         mean += matrix[x][y];
                 }
@@ -88,13 +86,14 @@ int main(int argc, char **argv)
         for(x = 0; x < X; x++) {
                 for (y = 0; y < Y; y++) {
                         int mpi_rank = my_distrib(x, y, size);
-                        if (mpi_rank == rank) {
-                                //fprintf(stderr, "[%d] Owning data[%d][%d]\n", rank, x, y);
+                        if (mpi_rank == my_rank) {
+                                //fprintf(stderr, "[%d] Owning data[%d][%d]\n", my_rank, x, y);
                                 starpu_variable_data_register(&data_handles[x][y], 0, (uintptr_t)&(matrix[x][y]), sizeof(unsigned));
                         }
-                        else if (rank == mpi_rank+1 || rank == mpi_rank-1) {
+			else if (my_rank == my_distrib(x+1, y, size) || my_rank == my_distrib(x-1, y, size)
+			      || my_rank == my_distrib(x, y+1, size) || my_rank == my_distrib(x, y-1, size)) {
                                 /* I don't own that index, but will need it for my computations */
-                                //fprintf(stderr, "[%d] Neighbour of data[%d][%d]\n", rank, x, y);
+                                //fprintf(stderr, "[%d] Neighbour of data[%d][%d]\n", my_rank, x, y);
                                 starpu_variable_data_register(&data_handles[x][y], -1, (uintptr_t)NULL, sizeof(unsigned));
                         }
                         else {
@@ -126,9 +125,9 @@ int main(int argc, char **argv)
 	starpu_shutdown();
 
         if (display) {
-                fprintf(stdout, "[%d] mean=%d\n", rank, mean);
+                fprintf(stdout, "[%d] mean=%d\n", my_rank, mean);
                 for(x = 0; x < X; x++) {
-                        fprintf(stdout, "[%d] ", rank);
+                        fprintf(stdout, "[%d] ", my_rank);
                         for (y = 0; y < Y; y++) {
                                 fprintf(stdout, "%3d ", matrix[x][y]);
                         }