39 #include "scip/scip.h" 49 ScipDiffParamSetMpi::createDatatype1(
52 MPI_Datatype datatype;
54 int blockLengthsPre[13];
55 MPI_Aint displacementsPre[13];
56 MPI_Datatype typesPre[13];
58 MPI_Aint startAddress = 0;
61 for(
int i = 0; i < 13; i++ ){
62 blockLengthsPre[i] = 1;
63 typesPre[i] = MPI_INT;
67 MPI_Get_address( &numBoolParams, &startAddress )
69 displacementsPre[0] = 0;
71 MPI_Get_address( &boolParamNamesSize, &address )
73 displacementsPre[1] = address - startAddress;
75 MPI_Get_address( &numIntParams, &address )
77 displacementsPre[2] = address - startAddress;
79 MPI_Get_address( &intParamNamesSize, &address )
81 displacementsPre[3] = address - startAddress;
83 MPI_Get_address( &numLongintParams, &address )
85 displacementsPre[4] = address - startAddress;
87 MPI_Get_address( &longintParamNamesSize, &address )
89 displacementsPre[5] = address - startAddress;
91 MPI_Get_address( &numRealParams, &address )
93 displacementsPre[6] = address - startAddress;
95 MPI_Get_address( &realParamNamesSize, &address )
97 displacementsPre[7] = address - startAddress;
99 MPI_Get_address( &numCharParams, &address )
101 displacementsPre[8] = address - startAddress;
103 MPI_Get_address( &charParamNamesSize, &address )
105 displacementsPre[9] = address - startAddress;
107 MPI_Get_address( &numStringParams, &address )
109 displacementsPre[10] = address - startAddress;
111 MPI_Get_address( &stringParamNamesSize, &address )
113 displacementsPre[11] = address - startAddress;
115 MPI_Get_address( &stringParamValuesSize, &address )
117 displacementsPre[12] = address - startAddress;
120 MPI_Type_create_struct(13, blockLengthsPre, displacementsPre, typesPre, &datatype)
129 ScipDiffParamSetMpi::createDatatype2(
130 bool memAllocNecessary
133 MPI_Datatype datatype;
135 int blockLengths[13];
136 MPI_Aint displacements[13];
137 MPI_Datatype types[13];
139 MPI_Aint startAddress = 0;
140 MPI_Aint address = 0;
142 if( memAllocNecessary ){
150 MPI_Get_address( &numBoolParams, &startAddress )
152 blockLengths[nBlocks] = 1;
153 displacements[nBlocks] = 0;
154 types[nBlocks++] = MPI_INT;
156 if( boolParamNamesSize > 0 )
159 MPI_Get_address( boolParamNames, &address )
161 blockLengths[nBlocks] = boolParamNamesSize;
162 displacements[nBlocks] = address - startAddress;
163 types[nBlocks++] = MPI_CHAR;
166 if( numBoolParams > 0 )
169 MPI_Get_address( boolParamValues, &address )
171 blockLengths[nBlocks] = numBoolParams;
172 displacements[nBlocks] = address - startAddress;
173 types[nBlocks++] = MPI_UNSIGNED;
177 if( intParamNamesSize > 0 )
180 MPI_Get_address( intParamNames, &address )
182 blockLengths[nBlocks] = intParamNamesSize;
183 displacements[nBlocks] = address - startAddress;
184 types[nBlocks++] = MPI_CHAR;
188 if( numIntParams > 0 )
191 MPI_Get_address( intParamValues, &address )
193 blockLengths[nBlocks] = numIntParams;
194 displacements[nBlocks] = address - startAddress;
195 types[nBlocks++] = MPI_INT;
198 if( longintParamNamesSize > 0 )
201 MPI_Get_address( longintParamNames, &address )
203 blockLengths[nBlocks] = longintParamNamesSize;
204 displacements[nBlocks] = address - startAddress;
205 types[nBlocks++] = MPI_CHAR;
208 if( numLongintParams > 0 )
211 MPI_Get_address( longintParamValues, &address )
213 blockLengths[nBlocks] = numLongintParams;
214 displacements[nBlocks] = address - startAddress;
216 types[nBlocks++] = MPI_LONG;
218 types[nBlocks++] = MPI_LONG_LONG;
222 if( realParamNamesSize > 0 )
225 MPI_Get_address( realParamNames, &address )
227 blockLengths[nBlocks] = realParamNamesSize;
228 displacements[nBlocks] = address - startAddress;
229 types[nBlocks++] = MPI_CHAR;
232 if( numRealParams > 0 )
235 MPI_Get_address( realParamValues, &address )
237 blockLengths[nBlocks] = numRealParams;
238 displacements[nBlocks] = address - startAddress;
239 types[nBlocks++] = MPI_DOUBLE;
242 if( charParamNamesSize > 0 )
245 MPI_Get_address( charParamNames, &address )
247 blockLengths[nBlocks] = charParamNamesSize;
248 displacements[nBlocks] = address - startAddress;
249 types[nBlocks++] = MPI_CHAR;
252 if( numCharParams > 0 )
255 MPI_Get_address( charParamValues, &address )
257 blockLengths[nBlocks] = numCharParams;
258 displacements[nBlocks] = address - startAddress;
259 types[nBlocks++] = MPI_CHAR;
262 if( stringParamNamesSize > 0 )
265 MPI_Get_address( stringParamNames, &address )
267 blockLengths[nBlocks] = stringParamNamesSize;
268 displacements[nBlocks] = address - startAddress;
269 types[nBlocks++] = MPI_CHAR;
272 if( stringParamValuesSize > 0 )
275 MPI_Get_address( stringParamValues, &address )
277 blockLengths[nBlocks] = stringParamValuesSize;
278 displacements[nBlocks] = address - startAddress;
279 types[nBlocks++] = MPI_CHAR;
284 MPI_Type_create_struct(nBlocks, blockLengths, displacements, types, &datatype)
292 ScipDiffParamSetMpi::bcast(
299 MPI_Datatype datatype = createDatatype1();
301 MPI_Type_commit( &datatype )
304 commMpi->ubcast(&numBoolParams, 1, datatype, root)
307 MPI_Type_free( &datatype )
312 datatype = createDatatype2(
false);
316 datatype = createDatatype2(
true);
319 MPI_Type_commit( &datatype )
322 commMpi->ubcast(&numBoolParams, 1, datatype, root)
325 MPI_Type_free( &datatype )
332 ScipDiffParamSetMpi::send(
338 MPI_Datatype datatype = createDatatype1();
340 MPI_Type_commit( &datatype )
346 MPI_Type_free( &datatype )
349 datatype = createDatatype2(
false);
351 MPI_Type_commit( &datatype )
354 commMpi->usend(&numBoolParams, 1, datatype, dest, TagSolverDiffParamSet1)
357 MPI_Type_free( &datatype )
365 ScipDiffParamSetMpi::receive(
371 MPI_Datatype datatype = createDatatype1();
373 MPI_Type_commit( &datatype )
379 MPI_Type_free( &datatype )
382 datatype = createDatatype2(
true);
384 MPI_Type_commit( &datatype )
387 commMpi->ureceive(&numBoolParams, 1, datatype, source, TagSolverDiffParamSet1)
390 MPI_Type_free( &datatype )
static ScipParaCommTh * comm
#define PARA_COMM_CALL(paracommcall)
virtual int getRank()=0
get rank of this process or this thread depending on run-time environment
ParaComm extension for MPI communication.
#define DEF_PARA_COMM(para_comm, comm)
static const int TagSolverDiffParamSet
#define MPI_CALL(mpicall)
Base class of communicator object.
ScipDiffParamSet extension for MPI communication.