[cig-commits] r14799 - mc/3D/CitcomS/trunk/lib
leif at geodynamics.org
leif at geodynamics.org
Mon Apr 27 11:39:16 PDT 2009
Author: leif
Date: 2009-04-27 11:39:15 -0700 (Mon, 27 Apr 2009)
New Revision: 14799
Modified:
mc/3D/CitcomS/trunk/lib/cgrad_kernel.cu
Log:
Consolidated calls to malloc/free.
Modified: mc/3D/CitcomS/trunk/lib/cgrad_kernel.cu
===================================================================
--- mc/3D/CitcomS/trunk/lib/cgrad_kernel.cu 2009-04-27 18:39:11 UTC (rev 14798)
+++ mc/3D/CitcomS/trunk/lib/cgrad_kernel.cu 2009-04-27 18:39:15 UTC (rev 14799)
@@ -37,20 +37,34 @@
int j,m,k;
double *S[27],*R[27];
- int sizeofk;
-
+ int dimofk;
+
+ double *memory, *memoryPtr;
+ int memoryDim;
+
#if 0 /* XXX */
MPI_Status status;
#endif
+
+ memoryDim = 0;
for (m=1;m<=E->sphere.caps_per_proc;m++) {
for (k=1;k<=E->parallel.TNUM_PASS[lev][m];k++) {
- sizeofk = (1+E->parallel.NUM_NEQ[lev][m].pass[k])*sizeof(double);
- S[k]=(double *)malloc( sizeofk );
- R[k]=(double *)malloc( sizeofk );
+ memoryDim += 2 * (1+E->parallel.NUM_NEQ[lev][m].pass[k]);
}
}
+ memory = (double *)malloc(memoryDim*sizeof(double));
+ memoryPtr = memory;
+ for (m=1;m<=E->sphere.caps_per_proc;m++) {
+ for (k=1;k<=E->parallel.TNUM_PASS[lev][m];k++) {
+ dimofk = 1+E->parallel.NUM_NEQ[lev][m].pass[k];
+ S[k] = memoryPtr; memoryPtr += dimofk;
+ R[k] = memoryPtr; memoryPtr += dimofk;
+ }
+ }
+ assert(memoryPtr == memory + memoryDim);
+
for (m=1;m<=E->sphere.caps_per_proc;m++) {
for (k=1;k<=E->parallel.TNUM_PASS[lev][m];k++) {
@@ -70,13 +84,9 @@
} /* for k */
} /* for m */ /* finish sending */
-
- for (m=1;m<=E->sphere.caps_per_proc;m++)
- for (k=1;k<=E->parallel.TNUM_PASS[lev][m];k++) {
- free((void*) S[k]);
- free((void*) R[k]);
- }
+ free(memory);
+
return;
}
@@ -332,19 +342,30 @@
const int mem_lev=E->mesh.levmax;
const int high_neq = E->lmesh.NEQ[level];
+
+ double *memory, *memoryPtr;
+ int memoryDim;
steps = *cycles;
-
+
+ memoryDim = E->sphere.caps_per_proc *
+ (5 * E->lmesh.NEQ[mem_lev] + /* r0,r1,r2,z0,z1 */
+ 3 * (1+E->lmesh.NEQ[mem_lev]) /* p1,p2,Ap */
+ );
+ memory = (double *)malloc(memoryDim*sizeof(double));
+
+ memoryPtr = memory;
for(m=1;m<=E->sphere.caps_per_proc;m++) {
- r0[m] = (double *)malloc(E->lmesh.NEQ[mem_lev]*sizeof(double));
- r1[m] = (double *)malloc(E->lmesh.NEQ[mem_lev]*sizeof(double));
- r2[m] = (double *)malloc(E->lmesh.NEQ[mem_lev]*sizeof(double));
- z0[m] = (double *)malloc(E->lmesh.NEQ[mem_lev]*sizeof(double));
- z1[m] = (double *)malloc(E->lmesh.NEQ[mem_lev]*sizeof(double));
- p1[m] = (double *)malloc((1+E->lmesh.NEQ[mem_lev])*sizeof(double));
- p2[m] = (double *)malloc((1+E->lmesh.NEQ[mem_lev])*sizeof(double));
- Ap[m] = (double *)malloc((1+E->lmesh.NEQ[mem_lev])*sizeof(double));
+ r0[m] = memoryPtr; memoryPtr += E->lmesh.NEQ[mem_lev];
+ r1[m] = memoryPtr; memoryPtr += E->lmesh.NEQ[mem_lev];
+ r2[m] = memoryPtr; memoryPtr += E->lmesh.NEQ[mem_lev];
+ z0[m] = memoryPtr; memoryPtr += E->lmesh.NEQ[mem_lev];
+ z1[m] = memoryPtr; memoryPtr += E->lmesh.NEQ[mem_lev];
+ p1[m] = memoryPtr; memoryPtr += (1+E->lmesh.NEQ[mem_lev]);
+ p2[m] = memoryPtr; memoryPtr += (1+E->lmesh.NEQ[mem_lev]);
+ Ap[m] = memoryPtr; memoryPtr += (1+E->lmesh.NEQ[mem_lev]);
}
+ assert(memoryPtr == memory + memoryDim);
for(m=1;m<=E->sphere.caps_per_proc;m++)
for(i=0;i<high_neq;i++) {
@@ -410,18 +431,9 @@
*cycles=count;
strip_bcs_from_residual(E,d0,level);
+
+ free(memory);
- for(m=1;m<=E->sphere.caps_per_proc;m++) {
- free((double*) r0[m]);
- free((double*) r1[m]);
- free((double*) r2[m]);
- free((double*) z0[m]);
- free((double*) z1[m]);
- free((double*) p1[m]);
- free((double*) p2[m]);
- free((double*) Ap[m]);
- }
-
return(residual);
}
More information about the CIG-COMMITS
mailing list