aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Schnetter <schnetter@gmail.com>2013-07-28 09:30:17 -0700
committerErik Schnetter <schnetter@gmail.com>2013-07-28 09:30:17 -0700
commitf3d0a945046a577f91a565a3b7d1142cf1254f28 (patch)
treed796d55d21d1bb99dfa8137f5028fdc39356833e
parent5944de36a22858eff9ea2e9bb7100f762ce7aeec (diff)
Add timing and operation counts to generated loops (but leave commented out)
Commented out; need to find efficient way to enable/disable this.
-rw-r--r--Auxiliary/Cactus/KrancNumericalTools/GenericFD/src/GenericFD.h1
-rw-r--r--Tools/CodeGen/CodeGenCactus.m58
2 files changed, 45 insertions, 14 deletions
diff --git a/Auxiliary/Cactus/KrancNumericalTools/GenericFD/src/GenericFD.h b/Auxiliary/Cactus/KrancNumericalTools/GenericFD/src/GenericFD.h
index 38ae740..9152427 100644
--- a/Auxiliary/Cactus/KrancNumericalTools/GenericFD/src/GenericFD.h
+++ b/Auxiliary/Cactus/KrancNumericalTools/GenericFD/src/GenericFD.h
@@ -32,6 +32,7 @@
# include <cmath>
#endif
#include <math.h>
+#include <sys/time.h>
#include <cctk.h>
diff --git a/Tools/CodeGen/CodeGenCactus.m b/Tools/CodeGen/CodeGenCactus.m
index 117d2e5..15c66f4 100644
--- a/Tools/CodeGen/CodeGenCactus.m
+++ b/Tools/CodeGen/CodeGenCactus.m
@@ -384,20 +384,50 @@ DefFn[
If[SOURCELANGUAGE == "C",
CommentedBlock[
"Loop over the grid points",
- {"#pragma omp parallel\n",
- If[vectorise, "CCTK_LOOP3STR", "CCTK_LOOP3"],
- "(", functionName, ",\n",
- " i,j,k, imin[0],imin[1],imin[2], imax[0],imax[1],imax[2],\n",
- " cctk_ash[0],cctk_ash[1],cctk_ash[2]",
- If[vectorise, {",\n", " vecimin,vecimax, CCTK_REAL_VEC_SIZE"}, ""],
- ")\n",
- "{\n",
- IndentBlock[
- {(* DeclareVariable["index", "// int"], *)
- (* DeclareAssignVariable["int", "index", "CCTK_GFINDEX3D(cctkGH,i,j,k)"], *)
- DeclareAssignVariable["ptrdiff_t", "index", "di*i + dj*j + dk*k"],
- block}], "}\n",
- If[vectorise, "CCTK_ENDLOOP3STR", "CCTK_ENDLOOP3"] <> "(", functionName, ");\n"}],
+ { "/* Circumvent a compiler bug on Blue Gene/Q */\n",
+ "const int imin0=imin[0];\n",
+ "const int imin1=imin[1];\n",
+ "const int imin2=imin[2];\n",
+ "const int imax0=imax[0];\n",
+ "const int imax1=imax[1];\n",
+ "const int imax2=imax[2];\n",
+ "// #undef VEC_COUNT\n",
+ "// #define VEC_COUNT(x) x\n",
+ "// double vec_iter_timer;\n",
+ "// {\n",
+ "// timeval tv;\n",
+ "// gettimeofday(&tv, NULL);\n",
+ "// vec_iter_timer = -(tv.tv_sec + 1.0e-6 * tv.tv_usec);\n",
+ "// }\n",
+ "// ptrdiff_t vec_iter_counter = 0;\n",
+ "// ptrdiff_t vec_op_counter = 0;\n",
+ "// ptrdiff_t vec_mem_counter = 0;\n",
+ "#pragma omp parallel // reduction(+: vec_iter_counter, vec_op_counter, vec_mem_counter)\n",
+ If[vectorise, "CCTK_LOOP3STR", "CCTK_LOOP3"],
+ "(", functionName, ",\n",
+ " i,j,k, imin0,imin1,imin2, imax0,imax1,imax2,\n",
+ " cctk_ash[0],cctk_ash[1],cctk_ash[2]",
+ If[vectorise, {",\n", " vecimin,vecimax, CCTK_REAL_VEC_SIZE"}, ""],
+ ")\n",
+ "{\n",
+ IndentBlock[
+ {(* DeclareVariable["index", "// int"], *)
+ (* DeclareAssignVariable["int", "index", "CCTK_GFINDEX3D(cctkGH,i,j,k)"], *)
+ DeclareAssignVariable["ptrdiff_t", "index", "di*i + dj*j + dk*k"],
+ If[vectorise,
+ "// vec_iter_counter+=CCTK_REAL_VEC_SIZE;\n",
+ "// ++vec_iter_counter;\n"],
+ block}],
+ "}\n",
+ If[vectorise, "CCTK_ENDLOOP3STR", "CCTK_ENDLOOP3"] <> "(", functionName, ");\n",
+ "// {\n",
+ "// timeval tv;\n",
+ "// gettimeofday(&tv, NULL);\n",
+ "// vec_iter_timer += tv.tv_sec + 1.0e-6 * tv.tv_usec;\n",
+ "// }\n",
+ "// CCTK_VInfo(CCTK_THORNSTRING, \"function="<>functionName<>" time=%g points=%td fp_ops=%td mem_ops=%td\", vec_iter_timer, vec_iter_counter, vec_op_counter, vec_mem_counter);\n",
+ "// #undef VEC_COUNT\n",
+ "// #define VEC_COUNT(x)\n"}],
(* else *)
""]];