From 3f861ce12833ea88df57f76fdf54365a30e45867 Mon Sep 17 00:00:00 2001 From: schnetter Date: Thu, 3 Sep 2009 13:18:02 +0000 Subject: Parallelise loops via OpenMP. Use C99 style variable declarations to simplify using OpenMP. git-svn-id: http://svn.cactuscode.org/arrangements/CactusNumerical/InterpToArray/trunk@14 6ca9aeac-0e4f-0410-a746-fe4df63e9d0c --- src/interp.c | 515 +++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 287 insertions(+), 228 deletions(-) diff --git a/src/interp.c b/src/interp.c index fa3ad16..d5d67b5 100644 --- a/src/interp.c +++ b/src/interp.c @@ -15,97 +15,80 @@ InterpToArray (CCTK_ARGUMENTS) DECLARE_CCTK_ARGUMENTS; DECLARE_CCTK_PARAMETERS; - int interpolator; - int options_table; - int coord_handle; - CCTK_REAL * restrict coordsx; - CCTK_REAL * restrict coordsy; - CCTK_REAL * restrict coordsz; - CCTK_POINTER_TO_CONST coords[3]; - CCTK_INT * restrict inputs; - CCTK_INT * restrict output_types; - CCTK_POINTER * restrict outputs; - CCTK_INT * restrict operation_codes; - CCTK_INT * restrict time_deriv_order; - int group; - cGroupDynamicData dyndata; - - int nvars; - int npoints; - - int n; - int i, j, k; - int ierr; - - - - interpolator = CCTK_InterpHandle (interpolator_name); + int const interpolator = CCTK_InterpHandle (interpolator_name); assert (interpolator >= 0); - options_table = Util_TableCreateFromString (interpolator_options); + int const options_table = Util_TableCreateFromString (interpolator_options); assert (options_table >= 0); - coord_handle = CCTK_CoordSystemHandle (interpolator_coordinates); + int const coord_handle = CCTK_CoordSystemHandle (interpolator_coordinates); assert (coord_handle >= 0); /* Scalars */ { - nvars = nscalars; + int const nvars = nscalars; if (nvars > 0) { - npoints = 1; + int const npoints = 1; - coordsx = malloc (npoints * sizeof * coordsx); + CCTK_REAL * restrict const + coordsx = malloc (npoints * sizeof * coordsx); assert (npoints==0 || coordsx); - coordsy = malloc (npoints * sizeof * coordsy); + CCTK_REAL * restrict const + coordsy = malloc (npoints * sizeof * coordsy); assert (npoints==0 || coordsy); - coordsz = malloc (npoints * sizeof * coordsz); + CCTK_REAL * restrict const + coordsz = malloc (npoints * sizeof * coordsz); assert (npoints==0 || coordsz); + CCTK_POINTER_TO_CONST coords[3]; coords[0] = coordsx; coords[1] = coordsy; coords[2] = coordsz; - n = 0; - assert (n <= npoints); - coordsx[n] = scalar_x0; - coordsy[n] = scalar_y0; - coordsz[n] = scalar_z0; - ++n; - assert (n == npoints); + { + int const n = 0; + coordsx[n] = scalar_x0; + coordsy[n] = scalar_y0; + coordsz[n] = scalar_z0; + } - inputs = malloc (nvars * sizeof * inputs); + CCTK_INT * restrict const + inputs = malloc (nvars * sizeof * inputs); assert (inputs); - for (n=0; n 0) { - npoints = array1d_npoints_i; + int const npoints = array1d_npoints_i; - coordsx = malloc (npoints * sizeof * coordsx); + CCTK_REAL * restrict const + coordsx = malloc (npoints * sizeof * coordsx); assert (npoints==0 || coordsx); - coordsy = malloc (npoints * sizeof * coordsy); + CCTK_REAL * restrict const + coordsy = malloc (npoints * sizeof * coordsy); assert (npoints==0 || coordsy); - coordsz = malloc (npoints * sizeof * coordsz); + CCTK_REAL * restrict const + coordsz = malloc (npoints * sizeof * coordsz); assert (npoints==0 || coordsz); + CCTK_POINTER_TO_CONST coords[3]; coords[0] = coordsx; coords[1] = coordsy; coords[2] = coordsz; - n = 0; - for (i=0; i= 0); if (inputs[n] < 0) { @@ -155,54 +141,69 @@ InterpToArray (CCTK_ARGUMENTS) } } - output_types = malloc (nvars * sizeof * output_types); + CCTK_INT * restrict const + output_types = malloc (nvars * sizeof * output_types); assert (output_types); - for (n=0; n 0) { - npoints = array2d_npoints_i * array2d_npoints_j; + int const npoints = array2d_npoints_i * array2d_npoints_j; - coordsx = malloc (npoints * sizeof * coordsx); + CCTK_REAL * restrict const + coordsx = malloc (npoints * sizeof * coordsx); assert (npoints==0 || coordsx); - coordsy = malloc (npoints * sizeof * coordsy); + CCTK_REAL * restrict const + coordsy = malloc (npoints * sizeof * coordsy); assert (npoints==0 || coordsy); - coordsz = malloc (npoints * sizeof * coordsz); + CCTK_REAL * restrict const + coordsz = malloc (npoints * sizeof * coordsz); assert (npoints==0 || coordsz); + CCTK_POINTER_TO_CONST coords[3]; coords[0] = coordsx; coords[1] = coordsy; coords[2] = coordsz; - n = 0; - for (j=0; j 0) { - npoints = array3d_npoints_i * array3d_npoints_j * array3d_npoints_k; + int const npoints = + array3d_npoints_i * array3d_npoints_j * array3d_npoints_k; - coordsx = malloc (npoints * sizeof * coordsx); + CCTK_REAL * restrict const + coordsx = malloc (npoints * sizeof * coordsx); assert (npoints==0 || coordsx); - coordsy = malloc (npoints * sizeof * coordsy); + CCTK_REAL * restrict const + coordsy = malloc (npoints * sizeof * coordsy); assert (npoints==0 || coordsy); - coordsz = malloc (npoints * sizeof * coordsz); + CCTK_REAL * restrict const + coordsz = malloc (npoints * sizeof * coordsz); assert (npoints==0 || coordsz); + CCTK_POINTER_TO_CONST coords[3]; coords[0] = coordsx; coords[1] = coordsy; coords[2] = coordsz; - n = 0; - for (k=0; k 0) { - group = CCTK_GroupIndex ("InterpToArray::parrays1d"); + int const group = CCTK_GroupIndex ("InterpToArray::parrays1d"); assert (group >= 0); - ierr = CCTK_GroupDynamicData (cctkGH, group, &dyndata); - assert (! ierr); + cGroupDynamicData dyndata; + { + int const ierr = CCTK_GroupDynamicData (cctkGH, group, &dyndata); + assert (! ierr); + } assert (dyndata.dim == 1); - npoints = dyndata.lsh[0]; + int const npoints = dyndata.lsh[0]; - coordsx = malloc (npoints * sizeof * coordsx); + CCTK_REAL * restrict const + coordsx = malloc (npoints * sizeof * coordsx); assert (npoints==0 || coordsx); - coordsy = malloc (npoints * sizeof * coordsy); + CCTK_REAL * restrict const + coordsy = malloc (npoints * sizeof * coordsy); assert (npoints==0 || coordsy); - coordsz = malloc (npoints * sizeof * coordsz); + CCTK_REAL * restrict const + coordsz = malloc (npoints * sizeof * coordsz); assert (npoints==0 || coordsz); + CCTK_POINTER_TO_CONST coords[3]; coords[0] = coordsx; coords[1] = coordsy; coords[2] = coordsz; - n = 0; - for (i=0; i= 0); if (inputs[n] < 0) { @@ -404,54 +426,69 @@ InterpToArray (CCTK_ARGUMENTS) } } - output_types = malloc (nvars * sizeof * output_types); + CCTK_INT * restrict const + output_types = malloc (nvars * sizeof * output_types); assert (output_types); - for (n=0; n 0) { - group = CCTK_GroupIndex ("InterpToArray::parrays2d"); + int const group = CCTK_GroupIndex ("InterpToArray::parrays2d"); assert (group >= 0); - ierr = CCTK_GroupDynamicData (cctkGH, group, &dyndata); - assert (! ierr); + cGroupDynamicData dyndata; + { + int const ierr = CCTK_GroupDynamicData (cctkGH, group, &dyndata); + assert (! ierr); + } assert (dyndata.dim == 2); - npoints = dyndata.lsh[0] * dyndata.lsh[1]; + int const npoints = dyndata.lsh[0] * dyndata.lsh[1]; - coordsx = malloc (npoints * sizeof * coordsx); + CCTK_REAL * restrict const + coordsx = malloc (npoints * sizeof * coordsx); assert (npoints==0 || coordsx); - coordsy = malloc (npoints * sizeof * coordsy); + CCTK_REAL * restrict const + coordsy = malloc (npoints * sizeof * coordsy); assert (npoints==0 || coordsy); - coordsz = malloc (npoints * sizeof * coordsz); + CCTK_REAL * restrict const + coordsz = malloc (npoints * sizeof * coordsz); assert (npoints==0 || coordsz); + CCTK_POINTER_TO_CONST coords[3]; coords[0] = coordsx; coords[1] = coordsy; coords[2] = coordsz; - n = 0; - for (j=0; j 0) { - group = CCTK_GroupIndex ("InterpToArray::parrays3d"); + int const group = CCTK_GroupIndex ("InterpToArray::parrays3d"); assert (group >= 0); - ierr = CCTK_GroupDynamicData (cctkGH, group, &dyndata); - assert (! ierr); + cGroupDynamicData dyndata; + { + int const ierr = CCTK_GroupDynamicData (cctkGH, group, &dyndata); + assert (! ierr); + } assert (dyndata.dim == 3); - npoints = dyndata.lsh[0] * dyndata.lsh[1] * dyndata.lsh[2]; + int const npoints = dyndata.lsh[0] * dyndata.lsh[1] * dyndata.lsh[2]; - coordsx = malloc (npoints * sizeof * coordsx); + CCTK_REAL * restrict const + coordsx = malloc (npoints * sizeof * coordsx); assert (npoints==0 || coordsx); - coordsy = malloc (npoints * sizeof * coordsy); + CCTK_REAL * restrict const + coordsy = malloc (npoints * sizeof * coordsy); assert (npoints==0 || coordsy); - coordsz = malloc (npoints * sizeof * coordsz); + CCTK_REAL * restrict const + coordsz = malloc (npoints * sizeof * coordsz); assert (npoints==0 || coordsz); + CCTK_POINTER_TO_CONST coords[3]; coords[0] = coordsx; coords[1] = coordsy; coords[2] = coordsz; - n = 0; - for (k=0; k