[cig-commits] r4347 - in long/3D/Gale/trunk/src/StGermain: . Base/Container/src

walter at geodynamics.org walter at geodynamics.org
Thu Aug 17 17:17:55 PDT 2006


Author: walter
Date: 2006-08-17 17:17:54 -0700 (Thu, 17 Aug 2006)
New Revision: 4347

Modified:
   long/3D/Gale/trunk/src/StGermain/
   long/3D/Gale/trunk/src/StGermain/Base/Container/src/MPIRoutines.c
   long/3D/Gale/trunk/src/StGermain/Base/Container/src/MPIRoutines.h
Log:
 r2718 at earth:  boo | 2006-08-17 17:14:26 -0700
  r2672 at earth (orig r3753):  LukeHodkinson | 2006-08-07 22:21:33 -0700
  Added an MPI helper routine to broadcast an array of
  data.
  
 



Property changes on: long/3D/Gale/trunk/src/StGermain
___________________________________________________________________
Name: svk:merge
   - 1ef209d2-b310-0410-a72d-e20c9eb0015c:/cig:2717
afb6c753-b9d0-0310-b4e7-dbd8d91cdd35:/trunk/StGermain:3752
   + 1ef209d2-b310-0410-a72d-e20c9eb0015c:/cig:2718
afb6c753-b9d0-0310-b4e7-dbd8d91cdd35:/trunk/StGermain:3753

Modified: long/3D/Gale/trunk/src/StGermain/Base/Container/src/MPIRoutines.c
===================================================================
--- long/3D/Gale/trunk/src/StGermain/Base/Container/src/MPIRoutines.c	2006-08-18 00:17:54 UTC (rev 4346)
+++ long/3D/Gale/trunk/src/StGermain/Base/Container/src/MPIRoutines.c	2006-08-18 00:17:54 UTC (rev 4347)
@@ -39,8 +39,32 @@
 #include "types.h"
 #include "MPIRoutines.h"
 
+
+void MPIArray_Bcast( unsigned* arraySize, void** array, size_t itemSize, 
+		     unsigned root, MPI_Comm comm )
+{
+	unsigned	nProcs;
+	unsigned	rank;
+
+	/* Sanity check. */
+	assert( !arraySize || array );
+
+	/* Get basic MPI info. */
+	MPI_Comm_size( comm, (int*)&nProcs );
+	MPI_Comm_rank( comm, (int*)&rank );
+
+	/* Send array sizes and allocate. */
+	MPI_Bcast( arraySize, 1, MPI_UNSIGNED, root, comm );
+	if( rank != root )
+		*array = Memory_Alloc_Array_Bytes_Unnamed( itemSize, *arraySize, "unknown" );
+
+	/* Send array. */
+	MPI_Bcast( *array, itemSize * (*arraySize), MPI_BYTE, root, comm );
+}
+
+
 void MPIArray_Gather( unsigned arraySize, void* array, 
-		      unsigned** dstSizes, void** dstArray, 
+		      unsigned** dstSizes, void*** dstArrays, 
 		      size_t itemSize, unsigned root, MPI_Comm comm )
 {
 	unsigned	nProcs;
@@ -48,6 +72,7 @@
 	unsigned*	tmpSizes;
 	unsigned*	disps;
 	unsigned	netSize;
+	unsigned*	tmpArray;
 	unsigned	p_i;
 
 	/* Get basic MPI info. */
@@ -81,24 +106,28 @@
 		}
 
 		if( netSize )
-			*dstArray = Memory_Alloc_Array_Bytes_Unnamed( itemSize, netSize, "unknown" );
+			tmpArray = Memory_Alloc_Array_Bytes_Unnamed( itemSize, netSize, "unknown" );
 		else
-			*dstArray = NULL;
+			tmpArray = NULL;
 	}
 	else {
-		*dstArray = NULL;
+		tmpArray = NULL;
 		tmpSizes = NULL;
 		disps = NULL;
 	}
 
 	/* Send/receive array/s. */
 	MPI_Gatherv( array, arraySize * itemSize, MPI_BYTE, 
-		     *dstArray, (int*)tmpSizes, (int*)disps, MPI_BYTE, 
+		     tmpArray, (int*)tmpSizes, (int*)disps, MPI_BYTE, 
 		     root, comm );
 
 	/* Free the displacements and temporary-sizes. */
 	FreeArray( disps );
 	FreeArray( tmpSizes );
+
+	/* Convert result to 2D array. */
+	if( rank == root )
+		Array_1DTo2D( nProcs, *dstSizes, tmpArray, dstArrays, itemSize );
 }
 
 void MPIArray_Allgather( unsigned arraySize, void* array, 
@@ -154,7 +183,7 @@
 	FreeArray( tmpSizes );
 
 	/* Unpack the 1D array into the 2D destination. */
-	Array_1DTo2D( nProcs, *dstSizes, tmpArray1D, dstArrays, sizeof(unsigned) );
+	Array_1DTo2D( nProcs, *dstSizes, tmpArray1D, dstArrays, itemSize );
 
 	/* Free resources. */
 	FreeArray( tmpArray1D );
@@ -227,7 +256,7 @@
 	FreeArray( tmpSrcArray1D );
 
 	/* Unpack the 1D array into the 2D destination. */
-	Array_1DTo2D( nProcs, *dstSizes, tmpDstArray1D, dstArrays, sizeof(unsigned) );
+	Array_1DTo2D( nProcs, *dstSizes, tmpDstArray1D, dstArrays, itemSize );
 
 	/* Free resources. */
 	FreeArray( tmpDstArray1D );
@@ -257,7 +286,7 @@
 				continue;
 			}
 
-			tmp[block_i] = Memory_Alloc_Array( unsigned char, sizes[block_i] * itemSize, "" );
+			tmp[block_i] = Memory_Alloc_Array_Bytes_Unnamed( itemSize, sizes[block_i], "unknown" );
 			memcpy( tmp[block_i], (unsigned char*)srcArray + curPos * itemSize, itemSize * sizes[block_i] );
 			curPos += sizes[block_i];
 		}

Modified: long/3D/Gale/trunk/src/StGermain/Base/Container/src/MPIRoutines.h
===================================================================
--- long/3D/Gale/trunk/src/StGermain/Base/Container/src/MPIRoutines.h	2006-08-18 00:17:54 UTC (rev 4346)
+++ long/3D/Gale/trunk/src/StGermain/Base/Container/src/MPIRoutines.h	2006-08-18 00:17:54 UTC (rev 4347)
@@ -41,8 +41,12 @@
 #ifndef __Base_Foundation_MPIRoutines_h__
 #define __Base_Foundation_MPIRoutines_h__
 
+
+void MPIArray_Bcast( unsigned* arraySize, void** array, size_t itemSize, 
+		     unsigned root, MPI_Comm comm );
+
 void MPIArray_Gather( unsigned arraySize, void* array, 
-		      unsigned** dstSizes, void** dstArray, 
+		      unsigned** dstSizes, void*** dstArrays, 
 		      size_t itemSize, unsigned root, MPI_Comm comm );
 
 void MPIArray_Allgather( unsigned arraySize, void* array, 
@@ -59,4 +63,5 @@
 void Array_2DTo1D( unsigned nBlocks, unsigned* sizes, void** srcArrays, 
 		   void** dstArray, size_t itemSize, unsigned** disps );
 
+
 #endif /* __Base_Foundation_MPIRoutines_h__ */



More information about the cig-commits mailing list