From 4fd25fac8d399c09b8b5447f95c002dfe243c3f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ole=20Sch=C3=BCtt?= Date: Sat, 29 Aug 2020 00:57:34 +0200 Subject: [PATCH] grid: Avoid BIND(C) on nested subroutines to make CCE happy --- src/grid/common/grid_library.c | 37 ++++++++++------ src/grid/common/grid_library.h | 4 +- src/grid/grid_api.F | 69 ++++++++++++++++-------------- src/grid/grid_collocate_miniapp.c | 12 ++++-- src/grid/grid_collocate_unittest.c | 12 ++++-- 5 files changed, 77 insertions(+), 57 deletions(-) diff --git a/src/grid/common/grid_library.c b/src/grid/common/grid_library.c index 4f7eb2737f..933e38ec4c 100644 --- a/src/grid/common/grid_library.c +++ b/src/grid/common/grid_library.c @@ -101,25 +101,33 @@ void grid_library_gather_stats(const grid_library_stats increment) { // \brief Prints statistics gathered by the grid library. // \author Ole Schuett //****************************************************************************** -void grid_library_print_stats(void (*mpi_sum_func)(long *), - void (*print_func)(char *)) { +void grid_library_print_stats(void (*mpi_sum_func)(long *, int), + const int mpi_comm, + void (*print_func)(char *, int), + const int output_unit) { if (!library_initialized) { printf("Error: Grid library is not initialized.\n"); abort(); } - print_func("\n"); + print_func("\n", output_unit); print_func(" ----------------------------------------------------------------" - "---------------\n"); + "---------------\n", + output_unit); print_func(" - " - " -\n"); + " -\n", + output_unit); print_func(" - GRID STATISTICS " - " -\n"); + " -\n", + output_unit); print_func(" - " - " -\n"); + " -\n", + output_unit); print_func(" ----------------------------------------------------------------" - "---------------\n"); + "---------------\n", + output_unit); print_func(" COUNTER " - " VALUE\n"); + " VALUE\n", + output_unit); grid_library_stats totals; memset(&totals, 0, sizeof(grid_library_stats)); @@ -129,18 +137,19 @@ void grid_library_print_stats(void (*mpi_sum_func)(long *), } char buffer[100]; - mpi_sum_func(&totals.ref_collocate_ortho); + mpi_sum_func(&totals.ref_collocate_ortho, mpi_comm); snprintf(buffer, sizeof(buffer), " %-58s %20li\n", "ref_collocate_ortho", totals.ref_collocate_ortho); - print_func(buffer); + print_func(buffer, output_unit); - mpi_sum_func(&totals.ref_collocate_general); + mpi_sum_func(&totals.ref_collocate_general, mpi_comm); snprintf(buffer, sizeof(buffer), " %-58s %20li\n", "ref_collocate_general", totals.ref_collocate_general); - print_func(buffer); + print_func(buffer, output_unit); print_func(" ----------------------------------------------------------------" - "---------------\n"); + "---------------\n", + output_unit); } // EOF diff --git a/src/grid/common/grid_library.h b/src/grid/common/grid_library.h index 2b18a4dd56..c34e67db96 100644 --- a/src/grid/common/grid_library.h +++ b/src/grid/common/grid_library.h @@ -44,8 +44,8 @@ grid_library_config grid_library_get_config(); // \brief Prints statistics gathered by the grid library. // \author Ole Schuett //****************************************************************************** -void grid_library_print_stats(void (*mpi_sum_func)(long *), - void (*print_func)(char *)); +void grid_library_print_stats(void (*mpi_sum_func)(long *, int), int mpi_comm, + void (*print_func)(char *, int), int output_unit); //****************************************************************************** // \brief All exiting counters. When adding a counter also update functions diff --git a/src/grid/grid_api.F b/src/grid/grid_api.F index 8f20b77100..f286544168 100644 --- a/src/grid/grid_api.F +++ b/src/grid/grid_api.F @@ -86,16 +86,6 @@ MODULE grid_api TYPE(C_PTR) :: c_ptr = C_NULL_PTR END TYPE grid_task_list_type - ! Can not place this into a subroutine because fpretty keeps removing it. - INTERFACE - SUBROUTINE grid_library_print_stats_c(mpi_sum_func, print_func) & - BIND(C, name="grid_library_print_stats") - IMPORT :: C_FUNPTR - TYPE(C_FUNPTR), VALUE :: mpi_sum_func - TYPE(C_FUNPTR), VALUE :: print_func - END SUBROUTINE grid_library_print_stats_c - END INTERFACE - CONTAINS ! ************************************************************************************************** @@ -842,50 +832,63 @@ CONTAINS !> \author Ole Schuett ! ************************************************************************************************** SUBROUTINE grid_library_print_stats(mpi_comm, output_unit) - INTEGER, INTENT(IN) :: mpi_comm, output_unit + INTEGER, INTENT(IN) :: mpi_comm, output_unit - ! Interface is defined above, because fpretty kept removing it from here. + INTERFACE + SUBROUTINE grid_library_print_stats_c(mpi_sum_func, mpi_comm, print_func, output_unit) & + BIND(C, name="grid_library_print_stats") + IMPORT :: C_FUNPTR, C_INT + TYPE(C_FUNPTR), VALUE :: mpi_sum_func + INTEGER(KIND=C_INT), VALUE :: mpi_comm + TYPE(C_FUNPTR), VALUE :: print_func + INTEGER(KIND=C_INT), VALUE :: output_unit + END SUBROUTINE grid_library_print_stats_c + END INTERFACE ! Since Fortran units and mpi groups can't be used from C, we pass function pointers instead. CALL grid_library_print_stats_c(mpi_sum_func=C_FUNLOC(mpi_sum_func), & - print_func=C_FUNLOC(print_func)) + mpi_comm=mpi_comm, & + print_func=C_FUNLOC(print_func), & + output_unit=output_unit) - CONTAINS + END SUBROUTINE grid_library_print_stats ! ************************************************************************************************** -!> \brief Closure to wrap a Fortran mpi communicator. +!> \brief Callback to run mpi_sum on a Fortran MPI communicator. !> \param number ... +!> \param mpi_comm ... !> \author Ole Schuett ! ************************************************************************************************** - SUBROUTINE mpi_sum_func(number) BIND(C) + SUBROUTINE mpi_sum_func(number, mpi_comm) BIND(C) INTEGER(KIND=C_LONG), INTENT(INOUT) :: number + INTEGER(KIND=C_INT), INTENT(IN), VALUE :: mpi_comm - CALL mp_sum(number, mpi_comm) - END SUBROUTINE mpi_sum_func + CALL mp_sum(number, mpi_comm) + END SUBROUTINE mpi_sum_func ! ************************************************************************************************** -!> \brief Closure to wrap a Fortran output unit. +!> \brief Callback to write to a Fortran output unit. !> \param message ... +!> \param output_unit ... !> \author Ole Schuett ! ************************************************************************************************** - SUBROUTINE print_func(message) BIND(C) + SUBROUTINE print_func(message, output_unit) BIND(C) CHARACTER(LEN=1, KIND=C_CHAR), INTENT(IN) :: message(*) + INTEGER(KIND=C_INT), INTENT(IN), VALUE :: output_unit CHARACTER(LEN=1000) :: buffer INTEGER :: i - IF (output_unit > 0) THEN - ! Convert C char array into Fortran string. - buffer = "" - DO i = 1, LEN(buffer) - IF (message(i) == C_NULL_CHAR) EXIT - buffer(i:i) = message(i) - END DO - ! Print the message. - WRITE (output_unit, FMT="(A)", ADVANCE="NO") buffer(1:i - 1) - END IF - END SUBROUTINE print_func - - END SUBROUTINE grid_library_print_stats + IF (output_unit > 0) THEN + ! Convert C char array into Fortran string. + buffer = "" + DO i = 1, LEN(buffer) + IF (message(i) == C_NULL_CHAR) EXIT + buffer(i:i) = message(i) + END DO + ! Print the message. + WRITE (output_unit, FMT="(A)", ADVANCE="NO") buffer(1:i - 1) + END IF + END SUBROUTINE print_func END MODULE grid_api diff --git a/src/grid/grid_collocate_miniapp.c b/src/grid/grid_collocate_miniapp.c index 800ded2bc5..451ec92173 100644 --- a/src/grid/grid_collocate_miniapp.c +++ b/src/grid/grid_collocate_miniapp.c @@ -10,11 +10,15 @@ #include "common/grid_library.h" #include "grid_collocate_replay.h" -void mpi_sum_func(long *number) { - *number += 0; // Nothing todo without MPI, pretend argument is used anyways. +void mpi_sum_func(long *number, int mpi_comm) { + *number += 0; // Nothing todo without MPI, pretend arguments are used anyways. + mpi_comm += 0; } -void print_func(char *message) { printf("%s", message); } +void print_func(char *message, int output_unit) { + output_unit += 0; // Pretent argument is used. + printf("%s", message); +} //****************************************************************************** // \brief Stand-alone miniapp for running .task files. @@ -56,7 +60,7 @@ int main(int argc, char *argv[]) { const double max_diff = grid_collocate_replay(argv[iarg++], cycles, batch, cycles_per_block); - grid_library_print_stats(&mpi_sum_func, &print_func); + grid_library_print_stats(&mpi_sum_func, 0, &print_func, 0); grid_library_finalize(); if (max_diff > 1e-12 * cycles) { diff --git a/src/grid/grid_collocate_unittest.c b/src/grid/grid_collocate_unittest.c index de6d3d7b4d..cbd3ac36c1 100644 --- a/src/grid/grid_collocate_unittest.c +++ b/src/grid/grid_collocate_unittest.c @@ -10,11 +10,15 @@ #include "common/grid_library.h" #include "grid_collocate_replay.h" -void mpi_sum_func(long *number) { - *number += 0; // Nothing todo without MPI, pretend argument is used anyways. +void mpi_sum_func(long *number, int mpi_comm) { + *number += 0; // Nothing todo without MPI, pretend arguments are used anyways. + mpi_comm += 0; } -void print_func(char *message) { printf("%s", message); } +void print_func(char *message, int output_unit) { + output_unit += 0; // Pretent argument is used. + printf("%s", message); +} //****************************************************************************** // \brief Unit test for the grid collocate code. @@ -66,7 +70,7 @@ int main(int argc, char *argv[]) { errors += run_test(argv[1], "collocate_general_subpatch16.task"); errors += run_test(argv[1], "collocate_ortho_non_periodic.task"); - grid_library_print_stats(&mpi_sum_func, &print_func); + grid_library_print_stats(&mpi_sum_func, 0, &print_func, 0); grid_library_finalize(); if (errors == 0) {