|
@@ -25,15 +25,15 @@ void stencil5_cpu(void *descr[], __attribute__ ((unused)) void *_args)
|
|
|
unsigned *xym1 = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[3]);
|
|
|
unsigned *xyp1 = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[4]);
|
|
|
|
|
|
-
|
|
|
- *xy = (*xy + *xm1y + *xp1y + *xym1 + *xyp1) / 5;
|
|
|
+
|
|
|
+ *xy = (*xy + *xm1y + *xp1y + *xym1 + *xyp1) / 5;
|
|
|
}
|
|
|
|
|
|
struct starpu_codelet stencil5_cl =
|
|
|
{
|
|
|
.where = STARPU_CPU,
|
|
|
.cpu_funcs = {stencil5_cpu, NULL},
|
|
|
- .nbuffers = 5,
|
|
|
+ .nbuffers = 5,
|
|
|
.modes = {STARPU_RW, STARPU_R, STARPU_R, STARPU_R, STARPU_R}
|
|
|
};
|
|
|
|
|
@@ -75,10 +75,10 @@ static void parse_args(int argc, char **argv)
|
|
|
|
|
|
int main(int argc, char **argv)
|
|
|
{
|
|
|
- int my_rank, size, x, y, loop;
|
|
|
- int value=0, mean=0;
|
|
|
- unsigned matrix[X][Y];
|
|
|
- starpu_data_handle_t data_handles[X][Y];
|
|
|
+ int my_rank, size, x, y, loop;
|
|
|
+ int value=0, mean=0;
|
|
|
+ unsigned matrix[X][Y];
|
|
|
+ starpu_data_handle_t data_handles[X][Y];
|
|
|
|
|
|
int ret = starpu_init(NULL);
|
|
|
STARPU_CHECK_RETURN_VALUE(ret, "starpu_init");
|
|
@@ -86,81 +86,81 @@ int main(int argc, char **argv)
|
|
|
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
|
|
|
MPI_Comm_size(MPI_COMM_WORLD, &size);
|
|
|
|
|
|
- parse_args(argc, argv);
|
|
|
+ parse_args(argc, argv);
|
|
|
|
|
|
- for(x = 0; x < X; x++)
|
|
|
+ for(x = 0; x < X; x++)
|
|
|
{
|
|
|
- for (y = 0; y < Y; y++)
|
|
|
+ for (y = 0; y < Y; y++)
|
|
|
{
|
|
|
- matrix[x][y] = (my_rank+1)*10 + value;
|
|
|
- value++;
|
|
|
- mean += matrix[x][y];
|
|
|
- }
|
|
|
- }
|
|
|
- mean /= value;
|
|
|
-
|
|
|
- for(x = 0; x < X; x++)
|
|
|
+ matrix[x][y] = (my_rank+1)*10 + value;
|
|
|
+ value++;
|
|
|
+ mean += matrix[x][y];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ mean /= value;
|
|
|
+
|
|
|
+ for(x = 0; x < X; x++)
|
|
|
{
|
|
|
- for (y = 0; y < Y; y++)
|
|
|
+ for (y = 0; y < Y; y++)
|
|
|
{
|
|
|
- int mpi_rank = my_distrib(x, y, size);
|
|
|
- if (mpi_rank == my_rank)
|
|
|
+ int mpi_rank = my_distrib(x, y, size);
|
|
|
+ if (mpi_rank == my_rank)
|
|
|
{
|
|
|
-
|
|
|
- starpu_variable_data_register(&data_handles[x][y], 0, (uintptr_t)&(matrix[x][y]), sizeof(unsigned));
|
|
|
- }
|
|
|
+
|
|
|
+ starpu_variable_data_register(&data_handles[x][y], 0, (uintptr_t)&(matrix[x][y]), sizeof(unsigned));
|
|
|
+ }
|
|
|
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))
|
|
|
+ || my_rank == my_distrib(x, y+1, size) || my_rank == my_distrib(x, y-1, size))
|
|
|
{
|
|
|
-
|
|
|
-
|
|
|
- starpu_variable_data_register(&data_handles[x][y], -1, (uintptr_t)NULL, sizeof(unsigned));
|
|
|
- }
|
|
|
- else
|
|
|
+
|
|
|
+
|
|
|
+ starpu_variable_data_register(&data_handles[x][y], -1, (uintptr_t)NULL, sizeof(unsigned));
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
-
|
|
|
- data_handles[x][y] = NULL;
|
|
|
- }
|
|
|
- if (data_handles[x][y])
|
|
|
+
|
|
|
+ data_handles[x][y] = NULL;
|
|
|
+ }
|
|
|
+ if (data_handles[x][y])
|
|
|
{
|
|
|
- starpu_data_set_rank(data_handles[x][y], mpi_rank);
|
|
|
- starpu_data_set_tag(data_handles[x][y], (y*X)+x);
|
|
|
+ starpu_data_set_rank(data_handles[x][y], mpi_rank);
|
|
|
+ starpu_data_set_tag(data_handles[x][y], (y*X)+x);
|
|
|
}
|
|
|
- }
|
|
|
- }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- for(loop=0 ; loop<niter; loop++)
|
|
|
+ for(loop=0 ; loop<niter; loop++)
|
|
|
{
|
|
|
- for (x = 1; x < X-1; x++)
|
|
|
+ for (x = 1; x < X-1; x++)
|
|
|
{
|
|
|
- for (y = 1; y < Y-1; y++)
|
|
|
+ for (y = 1; y < Y-1; y++)
|
|
|
{
|
|
|
- starpu_mpi_insert_task(MPI_COMM_WORLD, &stencil5_cl, STARPU_RW, data_handles[x][y],
|
|
|
- STARPU_R, data_handles[x-1][y], STARPU_R, data_handles[x+1][y],
|
|
|
- STARPU_R, data_handles[x][y-1], STARPU_R, data_handles[x][y+1],
|
|
|
- 0);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- fprintf(stderr, "Waiting ...\n");
|
|
|
- starpu_task_wait_for_all();
|
|
|
+ starpu_mpi_insert_task(MPI_COMM_WORLD, &stencil5_cl, STARPU_RW, data_handles[x][y],
|
|
|
+ STARPU_R, data_handles[x-1][y], STARPU_R, data_handles[x+1][y],
|
|
|
+ STARPU_R, data_handles[x][y-1], STARPU_R, data_handles[x][y+1],
|
|
|
+ 0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ fprintf(stderr, "Waiting ...\n");
|
|
|
+ starpu_task_wait_for_all();
|
|
|
|
|
|
starpu_mpi_shutdown();
|
|
|
starpu_shutdown();
|
|
|
|
|
|
- if (display)
|
|
|
+ if (display)
|
|
|
{
|
|
|
- fprintf(stdout, "[%d] mean=%d\n", my_rank, mean);
|
|
|
- for(x = 0; x < X; x++)
|
|
|
+ fprintf(stdout, "[%d] mean=%d\n", my_rank, mean);
|
|
|
+ for(x = 0; x < X; x++)
|
|
|
{
|
|
|
- fprintf(stdout, "[%d] ", my_rank);
|
|
|
- for (y = 0; y < Y; y++)
|
|
|
+ fprintf(stdout, "[%d] ", my_rank);
|
|
|
+ for (y = 0; y < Y; y++)
|
|
|
{
|
|
|
- fprintf(stdout, "%3u ", matrix[x][y]);
|
|
|
- }
|
|
|
- fprintf(stdout, "\n");
|
|
|
- }
|
|
|
- }
|
|
|
+ fprintf(stdout, "%3u ", matrix[x][y]);
|
|
|
+ }
|
|
|
+ fprintf(stdout, "\n");
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
return 0;
|
|
|
}
|