[cig-commits] r4866 - in long/3D/Gale/trunk/src/StGermain: . Discretisation/Mesh/src

walter at geodynamics.org walter at geodynamics.org
Wed Oct 11 13:47:49 PDT 2006


Author: walter
Date: 2006-10-11 13:47:49 -0700 (Wed, 11 Oct 2006)
New Revision: 4866

Modified:
   long/3D/Gale/trunk/src/StGermain/
   long/3D/Gale/trunk/src/StGermain/Discretisation/Mesh/src/Decomp_Sync.c
   long/3D/Gale/trunk/src/StGermain/Discretisation/Mesh/src/Decomp_Sync.h
Log:
 r2923 at earth:  boo | 2006-10-11 13:42:44 -0700
  r2839 at earth (orig r3827):  LukeHodkinson | 2006-10-04 18:09:01 -0700
  Added the ability to remove distributed arrays 
  after they've been added.
  
 



Property changes on: long/3D/Gale/trunk/src/StGermain
___________________________________________________________________
Name: svk:merge
   - 1ef209d2-b310-0410-a72d-e20c9eb0015c:/cig:2922
afb6c753-b9d0-0310-b4e7-dbd8d91cdd35:/trunk/StGermain:3826
   + 1ef209d2-b310-0410-a72d-e20c9eb0015c:/cig:2923
afb6c753-b9d0-0310-b4e7-dbd8d91cdd35:/trunk/StGermain:3827

Modified: long/3D/Gale/trunk/src/StGermain/Discretisation/Mesh/src/Decomp_Sync.c
===================================================================
--- long/3D/Gale/trunk/src/StGermain/Discretisation/Mesh/src/Decomp_Sync.c	2006-10-11 20:47:46 UTC (rev 4865)
+++ long/3D/Gale/trunk/src/StGermain/Discretisation/Mesh/src/Decomp_Sync.c	2006-10-11 20:47:49 UTC (rev 4866)
@@ -395,8 +395,8 @@
 	return self->shared[shared];
 }
 
-void Decomp_Sync_AddArray( void* sync, void* localArray, void* remoteArray, 
-			   size_t localStride, size_t remoteStride, size_t itemSize )
+Decomp_Sync_Array* Decomp_Sync_AddArray( void* sync, void* localArray, void* remoteArray, 
+					 size_t localStride, size_t remoteStride, size_t itemSize )
 {
 	Decomp_Sync*		self = (Decomp_Sync*)sync;
 	Decomp_Sync_Array*	array;
@@ -410,12 +410,13 @@
 
 	/* Resize the array array (?). */
 	if( self->nArrays ) {
-		self->arrays = Memory_Realloc_Array( self->arrays, Decomp_Sync_Array, ++self->nArrays );
+		self->arrays = Memory_Realloc_Array( self->arrays, Decomp_Sync_Array*, ++self->nArrays );
 	}
 	else {
-		self->arrays = Memory_Alloc_Array( Decomp_Sync_Array, ++self->nArrays, "Decomp_Sync::Arrays" );
+		self->arrays = Memory_Alloc_Array( Decomp_Sync_Array*, ++self->nArrays, "Decomp_Sync::Arrays" );
 	}
-	array = self->arrays + self->nArrays - 1;
+	self->arrays[self->nArrays - 1] = Memory_Alloc_Array_Unnamed( Decomp_Sync_Array, 1 );
+	array = self->arrays[self->nArrays - 1];
 
 	/* Store information. */
 	array->snkArray = localArray;
@@ -426,8 +427,31 @@
 
 	/* Build this array. */
 	Decomp_Sync_BuildArray( self, array );
+
+	return array;
 }
 
+void Decomp_Sync_RemoveArray( void* sync, Decomp_Sync_Array* array ) {
+	Decomp_Sync*	self = (Decomp_Sync*)sync;
+	unsigned	a_i;
+
+	assert( self );
+
+	a_i = 0;
+	while( self->arrays[a_i++] != array && a_i < self->nArrays );
+	assert( a_i <= self->nArrays );
+	for( ; a_i < self->nArrays; a_i++ )
+		self->arrays[a_i - 1] = self->arrays[a_i];
+
+	if( --self->nArrays == 0 ) {
+		KillArray( self->arrays );
+	}
+	else
+		self->arrays = Memory_Realloc_Array( self->arrays, Decomp_Sync_Array*, self->nArrays );
+
+	Decomp_Sync_DestructArray( array );
+}
+
 void Decomp_Sync_Sync( void* sync ) {
 	Decomp_Sync*	self = (Decomp_Sync*)sync;
 	unsigned	a_i;
@@ -437,10 +461,87 @@
 	assert( !self->nArrays || self->arrays );
 
 	for( a_i = 0; a_i < self->nArrays; a_i++ )
-		Decomp_Sync_SyncArray( self, self->arrays + a_i );
+		Decomp_Sync_SyncArray( self, self->arrays[a_i] );
 }
 
+void Decomp_Sync_SyncArray( void* sync, Decomp_Sync_Array* array ) {
+	Decomp_Sync*	self = (Decomp_Sync*)sync;
+	CommTopology*	commTopo;
+	unsigned	rank;
+	unsigned	nInc;
+	unsigned*	inc;
+	Stg_Byte*	snkArray;
+	Stg_Byte*	srcArray;
+	unsigned	p_i;
 
+	/* Sanity checks. */
+	assert( self );
+	assert( self->commTopo );
+	assert( array );
+
+	/* Shortcuts. */
+	commTopo = self->commTopo;
+	MPI_Comm_rank( commTopo->comm, (int*)&rank );
+
+	/* Pack from locals to a contiguous array. */
+	if( self->netSnks > 0 ) {
+		unsigned	snk_i;
+
+		snkArray = Memory_Alloc_Array_Unnamed( Stg_Byte, self->netSnks * array->itemSize );
+		for( snk_i = 0; snk_i < self->netSnks; snk_i++ ) {
+			memcpy( snkArray + snk_i * array->itemSize, 
+				(Stg_Byte*)array->snkArray + array->snkOffs[snk_i], 
+				array->itemSize );
+		}
+	}
+	else
+		snkArray = NULL;
+
+	/* Allocate for sources. */
+	if( self->netSrcs > 0 )
+		srcArray = Memory_Alloc_Array_Unnamed( Stg_Byte, self->netSrcs * array->itemSize );
+	else
+		srcArray = NULL;
+
+	/* Get incidence. */
+	CommTopology_GetIncidence( commTopo, rank, &nInc, &inc );
+
+	/* Transfer. */
+	for( p_i = 0; p_i < nInc; p_i++ ) {
+		int		snkSize = array->snkSizes[p_i];
+		int		snkDisp = array->snkDisps[p_i];
+		int		srcSize = array->srcSizes[p_i];
+		int		srcDisp = array->srcDisps[p_i];
+		MPI_Status	status;
+		unsigned	tag = 6669;
+
+		MPI_Sendrecv( snkArray + snkDisp, snkSize, MPI_BYTE, inc[p_i], tag, 
+			      srcArray + srcDisp, srcSize, MPI_BYTE, inc[p_i], tag, 
+			      commTopo->comm, &status );
+	}
+
+	/* Return incidence. */
+	CommTopology_ReturnIncidence( commTopo, rank, &nInc, &inc );
+
+	/* Free the sink array. */
+	FreeArray( snkArray );
+
+	/* Unpack sources. */
+	if( self->netSnks > 0 ) {
+		unsigned	src_i;
+
+		for( src_i = 0; src_i < self->netSrcs; src_i++ ) {
+			memcpy( (Stg_Byte*)array->srcArray + array->srcOffs[src_i], 
+				srcArray + src_i * array->itemSize, 
+				array->itemSize );
+		}
+	}
+
+	/* Free source array. */
+	FreeArray( srcArray );
+}
+
+
 /*----------------------------------------------------------------------------------------------------------------------------------
 ** Private Functions
 */
@@ -497,9 +598,9 @@
 		/* Only continue if we're part of the sub-communicator. */
 		if( rank >= p_i ) {
 			unsigned	nBytes;
-			Stg_Byte*		bytes;
+			Stg_Byte*	bytes;
 			unsigned*	nFounds;
-			Stg_Byte**		founds;
+			Stg_Byte**	founds;
 
 			/* Create a mapping between ranks. */
 			for( p_j = p_i; p_j < nProcs; p_j++ )
@@ -528,7 +629,7 @@
 			}
 
 			/* Retrieve the results and unpickle each of them. */
-			MPIArray_Gather( nBytes, bytes, &nFounds, (void***)&founds, sizeof(unsigned), 
+			MPIArray_Gather( nBytes, bytes, &nFounds, (void***)&founds, sizeof(Stg_Byte), 
 					 subRanks[p_i], subComm );
 			if( p_i == rank ) {
 				for( p_j = 0; p_j < nProcs - p_i; p_j++ ) {
@@ -538,7 +639,15 @@
 					iSets[worldRanks[p_j]] = RangeSet_New();
 					RangeSet_Unpickle( iSets[worldRanks[p_j]], nFounds[p_j], founds[p_j] );
 				}
+
+				/* Free the found arrays. */
+				FreeArray( nFounds );
+				FreeArray( founds );
 			}
+			else {
+				/* Free pickled range set. */
+				FreeArray( bytes );
+			}
 
 			/* Destroy the sub-communicator. */
 			MPI_Comm_free( &subComm );
@@ -663,82 +772,6 @@
 	self->grMap = map;
 }
 
-void Decomp_Sync_SyncArray( Decomp_Sync* self, Decomp_Sync_Array* array ) {
-	CommTopology*	commTopo;
-	unsigned	rank;
-	unsigned	nInc;
-	unsigned*	inc;
-	Stg_Byte*		snkArray;
-	Stg_Byte*		srcArray;
-	unsigned	p_i;
-
-	/* Sanity checks. */
-	assert( self );
-	assert( self->commTopo );
-	assert( array );
-
-	/* Shortcuts. */
-	commTopo = self->commTopo;
-	MPI_Comm_rank( commTopo->comm, (int*)&rank );
-
-	/* Pack from locals to a contiguous array. */
-	if( self->netSnks > 0 ) {
-		unsigned	snk_i;
-
-		snkArray = Memory_Alloc_Array_Unnamed( Stg_Byte, self->netSnks * array->itemSize );
-		for( snk_i = 0; snk_i < self->netSnks; snk_i++ ) {
-			memcpy( snkArray + snk_i * array->itemSize, 
-				(Stg_Byte*)array->snkArray + array->snkOffs[snk_i], 
-				array->itemSize );
-		}
-	}
-	else
-		snkArray = NULL;
-
-	/* Allocate for sources. */
-	if( self->netSrcs > 0 )
-		srcArray = Memory_Alloc_Array_Unnamed( Stg_Byte, self->netSrcs * array->itemSize );
-	else
-		srcArray = NULL;
-
-	/* Get incidence. */
-	CommTopology_GetIncidence( commTopo, rank, &nInc, &inc );
-
-	/* Transfer. */
-	for( p_i = 0; p_i < nInc; p_i++ ) {
-		int		snkSize = array->snkSizes[p_i];
-		int		snkDisp = array->snkDisps[p_i];
-		int		srcSize = array->srcSizes[p_i];
-		int		srcDisp = array->srcDisps[p_i];
-		MPI_Status	status;
-		unsigned	tag = 6669;
-
-		MPI_Sendrecv( snkArray + snkDisp, snkSize, MPI_BYTE, inc[p_i], tag, 
-			      srcArray + srcDisp, srcSize, MPI_BYTE, inc[p_i], tag, 
-			      commTopo->comm, &status );
-	}
-
-	/* Return incidence. */
-	CommTopology_ReturnIncidence( commTopo, rank, &nInc, &inc );
-
-	/* Free the sink array. */
-	FreeArray( snkArray );
-
-	/* Unpack sources. */
-	if( self->netSnks > 0 ) {
-		unsigned	src_i;
-
-		for( src_i = 0; src_i < self->netSrcs; src_i++ ) {
-			memcpy( (Stg_Byte*)array->srcArray + array->srcOffs[src_i], 
-				srcArray + src_i * array->itemSize, 
-				array->itemSize );
-		}
-	}
-
-	/* Free source array. */
-	FreeArray( srcArray );
-}
-
 void Decomp_Sync_BuildArray( Decomp_Sync* self, Decomp_Sync_Array* array ) {
 	CommTopology*	commTopo;
 	Decomp*		decomp;
@@ -907,14 +940,18 @@
 void Decomp_Sync_DestructArrays( Decomp_Sync* self ) {
 	unsigned	a_i;
 
-	for( a_i = 0; a_i < self->nArrays; a_i++ ) {
-		FreeArray( self->arrays[a_i].snkDisps );
-		FreeArray( self->arrays[a_i].snkSizes );
-		FreeArray( self->arrays[a_i].snkOffs );
-		FreeArray( self->arrays[a_i].srcDisps );
-		FreeArray( self->arrays[a_i].srcSizes );
-		FreeArray( self->arrays[a_i].srcOffs );
-	}
+	for( a_i = 0; a_i < self->nArrays; a_i++ )
+		Decomp_Sync_DestructArray( self->arrays[a_i] );
 	KillArray( self->arrays );
 	self->nArrays = 0;
 }
+
+void Decomp_Sync_DestructArray( Decomp_Sync_Array* array ) {
+	FreeArray( array->snkDisps );
+	FreeArray( array->snkSizes );
+	FreeArray( array->snkOffs );
+	FreeArray( array->srcDisps );
+	FreeArray( array->srcSizes );
+	FreeArray( array->srcOffs );
+	FreeArray( array );
+}

Modified: long/3D/Gale/trunk/src/StGermain/Discretisation/Mesh/src/Decomp_Sync.h
===================================================================
--- long/3D/Gale/trunk/src/StGermain/Discretisation/Mesh/src/Decomp_Sync.h	2006-10-11 20:47:46 UTC (rev 4865)
+++ long/3D/Gale/trunk/src/StGermain/Discretisation/Mesh/src/Decomp_Sync.h	2006-10-11 20:47:49 UTC (rev 4866)
@@ -95,7 +95,7 @@
 		unsigned**		snks;		\
 							\
 		unsigned		nArrays;	\
-		Decomp_Sync_Array*	arrays;
+		Decomp_Sync_Array**	arrays;
 
 	struct Decomp_Sync { __Decomp_Sync };
 
@@ -151,9 +151,11 @@
 	unsigned Decomp_Sync_DomainToShared( void* sync, unsigned domain );
 	unsigned Decomp_Sync_SharedToDomain( void* sync, unsigned shared );
 
-	void Decomp_Sync_AddArray( void* sync, void* localArray, void* remoteArray, 
-				   size_t localStride, size_t remoteStride, size_t itemSize );
+	Decomp_Sync_Array* Decomp_Sync_AddArray( void* sync, void* localArray, void* remoteArray, 
+						 size_t localStride, size_t remoteStride, size_t itemSize );
+	void Decomp_Sync_RemoveArray( void* sync, Decomp_Sync_Array* array );
 	void Decomp_Sync_Sync( void* sync );
+	void Decomp_Sync_SyncArray( void* self, Decomp_Sync_Array* array );
 
 	/*--------------------------------------------------------------------------------------------------------------------------
 	** Private Member functions
@@ -162,10 +164,11 @@
 	void Decomp_Sync_BuildIntersections( Decomp_Sync* self, unsigned nIndices, unsigned* indices );
 	void Decomp_Sync_BuildShared( Decomp_Sync* self );
 	void Decomp_Sync_BuildGRMap( Decomp_Sync* self );
-	void Decomp_Sync_SyncArray( Decomp_Sync* self, Decomp_Sync_Array* array );
+
 	void Decomp_Sync_BuildArray( Decomp_Sync* self, Decomp_Sync_Array* array );
 	void Decomp_Sync_Destruct( Decomp_Sync* self );
 	void Decomp_Sync_DestructRemotes( Decomp_Sync* self );
 	void Decomp_Sync_DestructArrays( Decomp_Sync* self );
+	void Decomp_Sync_DestructArray( Decomp_Sync_Array* array );
 
 #endif /* __Discretisaton_Mesh_Decomp_Sync_h__ */



More information about the cig-commits mailing list