[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