Skip to content

Commit 939afbd

Browse files
committed
GPU Standalone: Add dumping and reading of dynamic structs with larger buffer than sizeof(struct)
1 parent ceafd01 commit 939afbd

File tree

4 files changed

+68
-3
lines changed

4 files changed

+68
-3
lines changed

GPU/GPUTracking/Base/GPUReconstruction.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,9 +300,13 @@ class GPUReconstruction
300300
template <class T>
301301
void DumpStructToFile(const T* obj, const char* file);
302302
template <class T>
303+
void DumpDynamicStructToFile(const T* obj, size_t dynamicSize, const char* file);
304+
template <class T>
303305
std::unique_ptr<T> ReadStructFromFile(const char* file);
304306
template <class T>
305307
int32_t ReadStructFromFile(const char* file, T* obj);
308+
template <class T, auto F>
309+
aligned_unique_buffer_ptr<T> ReadDynamicStructFromFile(const char* file);
306310

307311
// Others
308312
virtual RecoStepField AvailableGPURecoSteps() { return RecoStep::AllRecoSteps; }

GPU/GPUTracking/Base/GPUReconstructionIO.h

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,57 @@ inline int32_t GPUReconstruction::ReadStructFromFile(const char* file, T* obj)
208208
return 0;
209209
}
210210

211+
template <class T>
212+
inline void GPUReconstruction::DumpDynamicStructToFile(const T* obj, size_t dynamicSize, const char* file)
213+
{
214+
FILE* fp = fopen(file, "w+b");
215+
if (fp == nullptr) {
216+
return;
217+
}
218+
size_t size = sizeof(*obj);
219+
fwrite(&size, sizeof(size), 1, fp);
220+
fwrite(&dynamicSize, sizeof(dynamicSize), 1, fp);
221+
fwrite(obj, 1, dynamicSize, fp);
222+
fclose(fp);
223+
}
224+
225+
template <class T, auto F>
226+
inline aligned_unique_buffer_ptr<T> GPUReconstruction::ReadDynamicStructFromFile(const char* file)
227+
{
228+
FILE* fp = fopen(file, "rb");
229+
if (fp == nullptr) {
230+
return nullptr;
231+
}
232+
size_t size, dynsize, r, r2;
233+
r = fread(&size, sizeof(size), 1, fp);
234+
r2 = fread(&dynsize, sizeof(dynsize), 1, fp);
235+
if (r == 0 || r2 == 0 || size != sizeof(T) || dynsize < size) {
236+
fclose(fp);
237+
GPUError("ERROR reading %s, invalid size: %ld (%ld buffer size, %ld object size expected)", file, (int64_t)size, (int64_t)dynsize, (int64_t)sizeof(T));
238+
throw std::runtime_error("invalid size");
239+
}
240+
std::unique_ptr<T> tmp = std::make_unique<T>();
241+
r = fread(tmp.get(), sizeof(T), 1, fp);
242+
if (r == 0) {
243+
fclose(fp);
244+
GPUError("ERROR reading %s", file, (int64_t)size, (int64_t)sizeof(T));
245+
throw std::runtime_error("read error");
246+
}
247+
if ((tmp.get()->*F)() != dynsize) {
248+
fclose(fp);
249+
GPUError("ERROR: invalid size: %ld (%ld expected)", file, (int64_t)dynsize, (int64_t)(tmp.get()->*F)());
250+
throw std::runtime_error("invalid size");
251+
}
252+
aligned_unique_buffer_ptr<T> newObj(dynsize);
253+
memcpy(newObj.get(), tmp.get(), sizeof(T));
254+
r = fread(newObj.getraw() + sizeof(T), 1, dynsize - sizeof(T), fp);
255+
fclose(fp);
256+
if (GetProcessingSettings().debugLevel >= 2) {
257+
GPUInfo("Read %ld bytes from %s", (int64_t)r, file);
258+
}
259+
return newObj;
260+
}
261+
211262
} // namespace o2::gpu
212263

213264
#endif

GPU/GPUTracking/Global/GPUChain.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,16 @@ class GPUChain
176176
{
177177
mRec->ReadStructFromFile<T>(file, obj);
178178
}
179+
template <class T>
180+
void DumpDynamicStructToFile(const T* obj, size_t dynamicSize, const char* file)
181+
{
182+
mRec->DumpDynamicStructToFile<T>(obj, dynamicSize, file);
183+
}
184+
template <class T, auto F>
185+
aligned_unique_buffer_ptr<T> ReadDynamicStructFromFile(const char* file)
186+
{
187+
return mRec->ReadDynamicStructFromFile<T, F>(file);
188+
}
179189

180190
template <class S, int32_t I = 0, typename... Args>
181191
requires(sizeof(S) >= 0) // Yields better incomplete type errors than calling runKernelCallInterface directly

GPU/GPUTracking/Global/GPUChainTrackingIO.cxx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ void GPUChainTracking::DumpSettings(const char* dir)
295295
if (processors()->calibObjects.fastTransform != nullptr) {
296296
f = dir;
297297
f += "tpctransform.dump";
298-
DumpStructToFile(processors()->calibObjects.fastTransform, f.c_str());
298+
DumpDynamicStructToFile(processors()->calibObjects.fastTransform, processors()->calibObjects.fastTransform->size(), f.c_str());
299299
}
300300
if (processors()->calibObjects.tpcPadGain != nullptr) {
301301
f = dir;
@@ -334,8 +334,8 @@ void GPUChainTracking::ReadSettings(const char* dir)
334334
std::string f;
335335
f = dir;
336336
f += "tpctransform.dump";
337-
mTPCFastTransformU = ReadStructFromFile<TPCFastTransformPOD>(f.c_str());
338-
processors()->calibObjects.fastTransform = (TPCFastTransformPOD*)mTPCFastTransformU.get();
337+
mTPCFastTransformU = ReadDynamicStructFromFile<TPCFastTransformPOD, &TPCFastTransformPOD::size>(f.c_str());
338+
processors()->calibObjects.fastTransform = mTPCFastTransformU.get();
339339
f = dir;
340340
f += "tpcpadgaincalib.dump";
341341
mTPCPadGainCalibU = ReadStructFromFile<TPCPadGainCalib>(f.c_str());

0 commit comments

Comments
 (0)