23 #include "splash/basetypes/basetypes.hpp" 25 #include "splash/ParallelDomainCollector.hpp" 26 #include "splash/AttributeInfo.hpp" 27 #include "splash/core/DCParallelDataSet.hpp" 28 #include "splash/core/logging.hpp" 33 std::string ParallelDomainCollector::getExceptionString(std::string func,
34 std::string msg,
const char *info)
36 std::stringstream full_msg;
37 full_msg <<
"Exception for ParallelDomainCollector::" << func <<
41 full_msg <<
" (" << info <<
")";
43 return full_msg.str();
46 void ParallelDomainCollector::writeDomainAttributes(
50 const Domain localDomain,
51 const Domain globalDomain)
56 writeAttribute(
id, dim_t, name, DOMCOL_ATTR_SIZE, localDomain.getSize().getPointer());
57 writeAttribute(
id, dim_t, name, DOMCOL_ATTR_OFFSET, localDomain.getOffset().getPointer());
58 writeAttribute(
id, dim_t, name, DOMCOL_ATTR_GLOBAL_SIZE, globalDomain.getSize().getPointer());
59 writeAttribute(
id, dim_t, name, DOMCOL_ATTR_GLOBAL_OFFSET, globalDomain.getOffset().getPointer());
63 const Dimensions topology, uint32_t maxFileHandles) :
76 if (this->fileStatus == FST_CLOSED)
77 throw DCException(getExceptionString(
"getGlobalDomain",
78 "this access is not permitted", NULL));
92 if (this->fileStatus == FST_CLOSED)
93 throw DCException(getExceptionString(
"getLocalDomain",
94 "this access is not permitted", NULL));
104 bool ParallelDomainCollector::readDomainDataForRank(
109 const Domain requestDomain,
118 local_client_domain.
getSize());
121 read(
id, name, data_elements, NULL);
126 if (tmp_data_class == GridType && data_elements != client_domain.getSize())
127 throw DCException(getExceptionString(
"readDomainDataForRank",
128 "Number of data elements must match domain size for Grid data.", NULL));
130 if (*dataClass == UndefinedType)
132 *dataClass = tmp_data_class;
134 if (tmp_data_class != *dataClass)
136 throw DCException(getExceptionString(
"readDomainDataForRank",
137 "Data classes in files are inconsistent!", NULL));
140 log_msg(3,
"clientdom. = %s", client_domain.toString().c_str());
149 if (*dataClass == PolyType)
151 log_msg(3,
"dataclass = Poly");
152 if (data_elements.getScalarSize() > 0)
154 std::stringstream group_id_name;
155 group_id_name << SDC_GROUP_DATA <<
"/" << id;
156 std::string group_id_string = group_id_name.str();
158 hid_t group_id = H5Gopen(handles.get(
id), group_id_string.c_str(), H5P_DEFAULT);
160 throw DCException(getExceptionString(
"readDomainDataForRank",
161 "group not found", group_id_string.c_str()));
163 size_t datatype_size = 0;
168 DCParallelDataSet tmp_dataset(name);
169 tmp_dataset.open(group_id);
171 datatype_size = tmp_dataset.getDataTypeSize();
172 dc_datatype = tmp_dataset.getDCDataType();
184 data_elements, datatype_size, dc_datatype);
189 handles.get(
id), id, name,
197 uint32_t src_rank = 0;
198 readCompleteDataSet(handles.get(
id), id, name,
206 if (!(elements_read == data_elements))
207 throw DCException(getExceptionString(
"readDomainDataForRank",
208 "Sizes are not equal but should be (1).", NULL));
211 dataContainer->
add(client_data);
214 log_msg(3,
"skipping entry with 0 elements");
219 if (*dataClass == GridType)
221 log_msg(3,
"dataclass = Grid");
227 std::stringstream group_id_name;
228 group_id_name << SDC_GROUP_DATA <<
"/" << id;
229 std::string group_id_string = group_id_name.str();
231 hid_t group_id = H5Gopen(handles.get(
id), group_id_string.c_str(), H5P_DEFAULT);
233 throw DCException(getExceptionString(
"readDomainDataForRank",
234 "group not found", group_id_string.c_str()));
236 size_t datatype_size = 0;
241 DCParallelDataSet tmp_dataset(name);
242 tmp_dataset.open(group_id);
244 datatype_size = tmp_dataset.getDataTypeSize();
245 dc_datatype = tmp_dataset.getDCDataType();
257 requestDomain, requestDomain.
getSize(),
258 datatype_size, dc_datatype);
260 dataContainer->
add(target_data);
269 Dimensions client_start = client_domain.getOffset();
272 size_t ndims = getNDims(handles.get(
id), id, name);
276 for (uint32_t i = 0; i < ndims; ++i)
278 dst_offset[i] = std::max((int64_t) client_domain.getOffset()[i] -
279 (int64_t) request_offset[i], (int64_t) 0);
281 if (request_offset[i] <= client_start[i])
285 if (request_offset[i] + request_size[i] >= client_start[i] + client_size[i])
286 src_size[i] = client_size[i];
288 src_size[i] = request_offset[i] + request_size[i] - client_start[i];
291 src_offset[i] = request_offset[i] - client_start[i];
293 if (request_offset[i] + request_size[i] >= client_start[i] + client_size[i])
294 src_size[i] = client_size[i] - src_offset[i];
296 src_size[i] = request_offset[i] + request_size[i] -
297 (client_start[i] + src_offset[i]);
302 "client_domain.getSize() = %s\n" 303 "data_elements = %s\n" 307 client_domain.getSize().toString().c_str(),
308 data_elements.toString().c_str(),
313 assert(src_size[0] <= requestDomain.
getSize()[0]);
314 assert(src_size[1] <= requestDomain.
getSize()[1]);
315 assert(src_size[2] <= requestDomain.
getSize()[2]);
319 uint32_t src_rank = 0;
321 readDataSet(handles.get(
id), id, name,
331 log_msg(3,
"elements_read = %s", elements_read.toString().c_str());
332 bool read_success =
true;
334 if ((request_size.
getScalarSize() == 0) && (elements_read.getScalarSize() != 0))
335 read_success =
false;
337 if ((request_size.
getScalarSize() != 0) && (elements_read != src_size))
338 read_success =
false;
342 throw DCException(getExceptionString(
"readDomainDataForRank",
343 "Sizes are not equal but should be (2).", NULL));
352 const Domain requestDomain,
357 if (fileStatus == FST_CLOSED)
359 "this access is not permitted", NULL));
367 readDomainDataForRank(data_container,
374 if (dataClass != NULL)
375 *dataClass = data_class;
377 return data_container;
383 if (domainData == NULL)
385 throw DCException(getExceptionString(
"readDomainLazy",
386 "Invalid parameter, DomainData must not be NULL", NULL));
389 DomainH5Ref *loadingRef = domainData->getLoadingReference();
390 if (loadingRef == NULL)
392 throw DCException(getExceptionString(
"readDomainLazy",
393 "This DomainData does not allow lazy loading", NULL));
396 if (loadingRef->dataClass == UndefinedType)
398 throw DCException(getExceptionString(
"readDomainLazy",
399 "DomainData has invalid data class", NULL));
402 if (loadingRef->dataClass == PolyType)
405 uint32_t src_rank = 0;
406 readDataSet(loadingRef->handle,
408 loadingRef->name.c_str(),
409 loadingRef->dstBuffer,
410 loadingRef->dstOffset,
412 loadingRef->srcOffset,
415 domainData->getData());
417 if (!(elements_read == loadingRef->dstBuffer))
418 throw DCException(getExceptionString(
"readDomainLazy",
419 "Sizes are not equal but should be (1).", NULL));
424 throw DCException(getExceptionString(
"readDomainLazy",
425 "data class not supported", NULL));
435 const Domain globalDomain,
441 gatherMPIWrites(ndims, select.count, globalSize, globalOffset);
445 name, globalDomain, dataClass, buf);
455 const Domain globalDomain,
460 write(
id, globalSize, globalOffset, type, ndims, select, name, buf);
463 writeDomainAttributes(
id, name, dataClass, localDomain, globalDomain);
471 const Domain globalDomain,
475 reserve(
id, globalSize, ndims, type, name);
478 writeDomainAttributes(
id, name, dataClass, localDomain, globalDomain);
488 const Domain globalDomain,
492 reserve(
id, size, globalSize, globalOffset, ndims, type, name);
495 writeDomainAttributes(
id, name, dataClass, localDomain, globalDomain);
498 void ParallelDomainCollector::appendDomain(int32_t
id,
503 const Domain globalDomain,
507 appendDomain(
id, type, count, 0, 1, name, localDomain, globalDomain, buf);
510 void ParallelDomainCollector::appendDomain(int32_t ,
521 throw DCException(
"This feature is not supported in ParallelDomainCollector. " 522 "Use ParallelDataCollector::append instead.");
Domain getLocalDomain(int32_t id, const char *name)
std::string toString() const
Domain getGlobalDomain(int32_t id, const char *name)
std::string toString() const
void reserveDomain(int32_t id, const Dimensions globalSize, uint32_t ndims, const CollectionType &type, const char *name, const Domain domain, DomDataClass dataClass)
void setLoadingReference(int dataClass, hid_t handle, int32_t id, const char *name, const Dimensions dstBuffer, const Dimensions dstOffset, const Dimensions srcSize, const Dimensions srcOffset)
size_t getScalarSize() const
AttributeInfo readAttributeInfo(int32_t id, const char *dataName, const char *attrName, Dimensions *mpiPosition=NULL)
DomainData * getIndex(size_t index)
ParallelDomainCollector(MPI_Comm comm, MPI_Info info, const Dimensions topology, uint32_t maxFileHandles)
void write(int32_t id, const CollectionType &type, uint32_t rank, const Selection select, const char *name, const void *buf)
void add(DomainData *entry)
void read(int32_t id, const char *name, Dimensions &sizeRead, void *buf)
void readDomainLazy(DomainData *domainData)
static bool testIntersection(const Domain &d1, const Domain &d2)
EXTERN void log_msg(int level, const char *fmt,...)
DataContainer * readDomain(int32_t id, const char *name, const Domain requestDomain, DomDataClass *dataClass, bool lazyLoad=false)
void reserve(int32_t id, const Dimensions globalSize, uint32_t rank, const CollectionType &type, const char *name)
virtual ~ParallelDomainCollector()
void writeAttribute(int32_t id, const CollectionType &type, const char *dataName, const char *attrName, const void *buf)
void read(const CollectionType &colType, void *buf)
void writeDomain(int32_t id, const CollectionType &type, uint32_t ndims, const Selection select, const char *name, const Domain localDomain, const Domain globalDomain, DomDataClass dataClass, const void *buf)
size_t getNumSubdomains()