3535
3636#include < atomic>
3737#include < ctime>
38+ #include < fstream>
3839
3940#ifndef _WIN32
4041#include < unistd.h>
@@ -263,6 +264,31 @@ int32_t GPUReconstructionCPU::RunChains()
263264 }
264265 double kernelTotal = 0 ;
265266 std::vector<double > kernelStepTimes (gpudatatypes::N_RECO_STEPS , 0 .);
267+ std::ofstream timingCSVFile;
268+ if (!GetProcessingSettings ().timingCSV .empty ()) {
269+ bool needHeader = true ;
270+ {
271+ std::ifstream timingCSVIn (GetProcessingSettings ().timingCSV );
272+ needHeader = !timingCSVIn.good () || timingCSVIn.peek () == std::ifstream::traits_type::eof ();
273+ }
274+ timingCSVFile.open (GetProcessingSettings ().timingCSV , std::ios::out | std::ios::app);
275+ if (!timingCSVFile.is_open ()) {
276+ GPUError (" Could not open timing CSV file '%s' for writing" , GetProcessingSettings ().timingCSV .c_str ());
277+ } else if (needHeader) {
278+ timingCSVFile << " name,time,count,events\n " ;
279+ }
280+ }
281+ auto writeCSVString = [](std::ostream& out, const std::string& s) {
282+ out << ' "' ;
283+ for (char c : s) {
284+ if (c == ' "' ) {
285+ out << " \"\" " ;
286+ } else {
287+ out << c;
288+ }
289+ }
290+ out << ' "' ;
291+ };
266292
267293 if (GetProcessingSettings ().debugLevel >= 1 ) {
268294 for (uint32_t i = 0 ; i < mTimers .size (); i++) {
@@ -289,6 +315,10 @@ int32_t GPUReconstructionCPU::RunChains()
289315 snprintf (bandwidth, 256 , " (%8.3f GB/s - %'14zu bytes - %'14zu per call)" , mTimers [i]->memSize / time * 1e-9 , mTimers [i]->memSize / mStatNEvents , mTimers [i]->memSize / mStatNEvents / mTimers [i]->count );
290316 }
291317 printf (" Execution Time: Task (%c %8ux): %50s Time: %'10.0f us%s\n " , type == 0 ? ' K' : ' C' , mTimers [i]->count , mTimers [i]->name .c_str (), time * 1000000 / mStatNEvents , bandwidth);
318+ if (timingCSVFile.is_open ()) {
319+ writeCSVString (timingCSVFile, mTimers [i]->name );
320+ timingCSVFile << " ," << (time * 1000000 / mStatNEvents ) << " ," << mTimers [i]->count << " ," << mStatNEvents << " \n " ;
321+ }
292322 if (GetProcessingSettings ().resetTimers ) {
293323 mTimers [i]->count = 0 ;
294324 mTimers [i]->memSize = 0 ;
0 commit comments