44 static void printhsizet(
const char *name,
const hsize_t *data, hsize_t rank)
46 std::cerr << name <<
" = (";
47 for (hsize_t i = 0; i < rank - 1; i++)
48 std::cerr << data[i] <<
", ";
49 std::cerr << data[rank - 1];
50 std::cerr <<
")" << std::endl;
59 static void swapHSize(hsize_t *hs, uint32_t rank)
65 hsize_t tmp3[DSP_DIM_MAX];
79 for (uint32_t i = 0; i < 3; i++)
102 static void getOptimalChunkDims(
const hsize_t *dims, uint32_t ndims,
103 size_t typeSize, hsize_t *chunkDims)
105 const size_t NUM_CHUNK_SIZES = 7;
107 const size_t CHUNK_SIZES_KB[] = {4096, 2048, 1024, 512, 256, 128, 64};
109 size_t total_data_size = typeSize;
110 size_t max_chunk_size = typeSize;
111 size_t target_chunk_size = 0;
115 std::multimap<hsize_t, uint32_t> dims_order;
116 for (uint32_t i = 0; i < ndims; ++i)
117 dims_order.insert(std::make_pair(dims[i], i));
119 for (uint32_t i = 0; i < ndims; ++i)
125 size_t half_dim = dims[i] / 2;
128 max_chunk_size *= (half_dim > 0) ? half_dim : 1;
129 total_data_size *= dims[i];
133 for (uint32_t i = 0; i < NUM_CHUNK_SIZES; ++i)
135 target_chunk_size = CHUNK_SIZES_KB[i] * 1024;
136 if (target_chunk_size <= max_chunk_size)
140 size_t current_chunk_size = typeSize;
141 size_t last_chunk_diff = target_chunk_size;
142 std::multimap<hsize_t, uint32_t>::const_iterator current_index =
145 while (current_chunk_size < target_chunk_size)
148 size_t chunk_diff = target_chunk_size - (current_chunk_size * 2u);
149 if (chunk_diff >= last_chunk_diff)
153 int can_increase_dim = 0;
154 for (uint32_t d = 0; d < ndims; ++d)
156 int current_dim = current_index->second;
159 if (chunkDims[current_dim] * 2 <= dims[current_dim])
161 chunkDims[current_dim] *= 2;
162 current_chunk_size *= 2;
163 can_increase_dim = 1;
167 if (current_index == dims_order.end())
168 current_index = dims_order.begin();
170 if (can_increase_dim)
176 if (!can_increase_dim)
179 last_chunk_diff = chunk_diff;
188 static bool testFilename(
const std::string& filename)
190 if (filename.rfind(
".h5.h5") == filename.length() - 6)
192 std::cerr << std::endl <<
"\tWarning: DCHelper: Do you really want to access " 193 << filename.c_str() <<
"?" << std::endl;
197 if (filename.find(
".h5") != filename.length() - 3)
199 std::cerr << std::endl <<
"\tWarning: DCHelper: " 200 <<
"Duplicate or missing file name extension. " 201 <<
"Do you really want to access " 202 << filename.c_str() <<
"?" << std::endl;