[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