[cig-commits] r15515 - mc/3D/CitcomS/trunk/lib

leif at geodynamics.org leif at geodynamics.org
Mon Aug 3 18:45:56 PDT 2009


Author: leif
Date: 2009-08-03 18:45:56 -0700 (Mon, 03 Aug 2009)
New Revision: 15515

Modified:
   mc/3D/CitcomS/trunk/lib/multigrid_kernel.cu
Log:
The function collect_terms() turns out to be quite expensive (over 70%
according to gprof).  Perform it once per level, caching the result.


Modified: mc/3D/CitcomS/trunk/lib/multigrid_kernel.cu
===================================================================
--- mc/3D/CitcomS/trunk/lib/multigrid_kernel.cu	2009-08-03 23:26:59 UTC (rev 15514)
+++ mc/3D/CitcomS/trunk/lib/multigrid_kernel.cu	2009-08-04 01:45:56 UTC (rev 15515)
@@ -653,7 +653,7 @@
     assert(E->parallel.nproc == 1);
 }
 
-static void collect_terms(
+static int2 *collect_terms(
     struct Some_variables *E
     )
 {
@@ -662,7 +662,7 @@
     const int neq = E->lmesh.NEQ;
     const int nno = E->lmesh.NNO;
     
-    E->term = (int2 *)malloc((neq+1) * MAX_EQN * sizeof(int2));
+    int2 *term = (int2 *)malloc((neq+1) * MAX_EQN * sizeof(int2));
     
     for (int e = 0; e <= neq; e++) {
         int2 *term = E->term + e*MAX_EQN;
@@ -688,7 +688,7 @@
         }
     }
     
-    return;
+    return term;
 }
 
 
@@ -728,7 +728,10 @@
     
     kE.NODE = E->NODE[level][M];
     
-    collect_terms(&kE);
+    static int2 *term[MAX_LEVELS];
+    if (!term[level])
+        term[level] = collect_terms(&kE);
+    kE.term = term[level];
     
     do_gauss_seidel(
         &kE,



More information about the CIG-COMMITS mailing list