diff --git a/GPU/GPUTracking/Base/cuda/CMakeLists.txt b/GPU/GPUTracking/Base/cuda/CMakeLists.txt index 97972265b3007..eff3e201f7863 100644 --- a/GPU/GPUTracking/Base/cuda/CMakeLists.txt +++ b/GPU/GPUTracking/Base/cuda/CMakeLists.txt @@ -159,25 +159,29 @@ endif() if(GPUCA_CUDA_COMPILE_MODE STREQUAL "onefile") target_compile_definitions(${targetName} PRIVATE GPUCA_KERNEL_COMPILE_MODE=0) elseif(GPUCA_CUDA_COMPILE_MODE STREQUAL "perkernel") - add_library(GPUTrackingCUDAKernels OBJECT $,REPLACE,[^A-Za-z0-9]+,_>,PREPEND,${O2_GPU_KERNEL_WRAPPER_FOLDER}/krnl_>,APPEND,.cu>, >) - set_property(TARGET GPUTrackingCUDAKernels PROPERTY CUDA_FATBIN_COMPILATION ON) - set_property(TARGET GPUTrackingCUDAKernels PROPERTY CUDA_SEPARABLE_COMPILATION OFF) target_compile_definitions(${targetName} PRIVATE GPUCA_KERNEL_COMPILE_MODE=1) - target_compile_definitions(GPUTrackingCUDAKernels PRIVATE $) - target_include_directories(GPUTrackingCUDAKernels PRIVATE $) - target_link_libraries(GPUTrackingCUDAKernels PRIVATE $) - file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/cuda_kernel_module_fatbin) - add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/GPUTrackingCUDAKernelModules.o - COMMAND cp -u $ ${CMAKE_CURRENT_BINARY_DIR}/cuda_kernel_module_fatbin/ - COMMAND ${CMAKE_LINKER} -z noexecstack --relocatable --format binary --output ${CMAKE_CURRENT_BINARY_DIR}/GPUTrackingCUDAKernelModules.o $>,PREPEND,${CMAKE_CURRENT_BINARY_DIR}/cuda_kernel_module_fatbin/>,${CMAKE_CURRENT_BINARY_DIR}> - DEPENDS GPUTrackingCUDAKernels $ - COMMENT "Compiling fatbin kernels ${CMAKE_CURRENT_BINARY_DIR}/GPUTrackingCUDAKernelModules.o" - VERBATIM - COMMAND_EXPAND_LISTS - ) - target_sources(${targetName} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/GPUTrackingCUDAKernelModules.o) - set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/GPUTrackingCUDAKernelModules.o PROPERTIES EXTERNAL_OBJECT true GENERATED true) + if(NOT DEFINED GPUCA_RTC_NO_COMPILED_KERNELS OR NOT GPUCA_RTC_NO_COMPILED_KERNELS) + add_library(GPUTrackingCUDAKernels OBJECT $,REPLACE,[^A-Za-z0-9]+,_>,PREPEND,${O2_GPU_KERNEL_WRAPPER_FOLDER}/krnl_>,APPEND,.cu>, >) + set_property(TARGET GPUTrackingCUDAKernels PROPERTY CUDA_FATBIN_COMPILATION ON) + set_property(TARGET GPUTrackingCUDAKernels PROPERTY CUDA_SEPARABLE_COMPILATION OFF) + target_compile_definitions(GPUTrackingCUDAKernels PRIVATE $) + target_include_directories(GPUTrackingCUDAKernels PRIVATE $) + target_link_libraries(GPUTrackingCUDAKernels PRIVATE $) + file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/cuda_kernel_module_fatbin) + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/GPUTrackingCUDAKernelModules.o + COMMAND cp -u $ ${CMAKE_CURRENT_BINARY_DIR}/cuda_kernel_module_fatbin/ + COMMAND ${CMAKE_LINKER} -z noexecstack --relocatable --format binary --output ${CMAKE_CURRENT_BINARY_DIR}/GPUTrackingCUDAKernelModules.o $>,PREPEND,${CMAKE_CURRENT_BINARY_DIR}/cuda_kernel_module_fatbin/>,${CMAKE_CURRENT_BINARY_DIR}> + DEPENDS GPUTrackingCUDAKernels $ + COMMENT "Compiling fatbin kernels ${CMAKE_CURRENT_BINARY_DIR}/GPUTrackingCUDAKernelModules.o" + VERBATIM + COMMAND_EXPAND_LISTS + ) + target_sources(${targetName} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/GPUTrackingCUDAKernelModules.o) + set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/GPUTrackingCUDAKernelModules.o PROPERTIES EXTERNAL_OBJECT true GENERATED true) + else() + set_source_files_properties(GPUReconstructionCUDA.cu PROPERTIES COMPILE_DEFINITIONS GPUCA_RTC_NO_COMPILED_KERNELS) + endif() elseif(GPUCA_CUDA_COMPILE_MODE STREQUAL "rdc") message(FATAL_ERROR "CUDA RDC compilation of GPUReconstruction ios not yet working!") diff --git a/GPU/GPUTracking/Base/cuda/GPUReconstructionCUDA.cu b/GPU/GPUTracking/Base/cuda/GPUReconstructionCUDA.cu index 0d5666b8ee790..7552d22056c3c 100644 --- a/GPU/GPUTracking/Base/cuda/GPUReconstructionCUDA.cu +++ b/GPU/GPUTracking/Base/cuda/GPUReconstructionCUDA.cu @@ -34,7 +34,11 @@ #else // HIP #define PER_KERNEL_OBJECT_EXT _hip_o #endif +#ifdef GPUCA_RTC_NO_COMPILED_KERNELS +#define GPUCA_KRNL(x_class, ...) static void* GPUCA_M_CAT3(_binary_cuda_kernel_module_fatbin_krnl_, GPUCA_M_KRNL_NAME(x_class), GPUCA_M_CAT(PER_KERNEL_OBJECT_EXT, _start)) = nullptr; +#else #define GPUCA_KRNL(x_class, ...) QGET_LD_BINARY_SYMBOLS(GPUCA_M_CAT3(cuda_kernel_module_fatbin_krnl_, GPUCA_M_KRNL_NAME(x_class), PER_KERNEL_OBJECT_EXT)) +#endif #include "GPUReconstructionKernelList.h" #undef GPUCA_KRNL #endif @@ -335,6 +339,9 @@ int32_t GPUReconstructionCUDA::InitDevice_Runtime() } #if defined(GPUCA_KERNEL_COMPILE_MODE) && GPUCA_KERNEL_COMPILE_MODE == 1 else { +#ifdef GPUCA_RTC_NO_COMPILED_KERNELS + GPUFatal("Compiled with GPUCA_RTC_NO_COMPILED_KERNELS, must run RTC mode!"); +#endif #define GPUCA_KRNL(x_class, ...) \ mInternals->kernelModules.emplace_back(std::make_unique()); \ GPUChkErr(cuModuleLoadData(mInternals->kernelModules.back().get(), GPUCA_M_CAT3(_binary_cuda_kernel_module_fatbin_krnl_, GPUCA_M_KRNL_NAME(x_class), GPUCA_M_CAT(PER_KERNEL_OBJECT_EXT, _start)))); diff --git a/GPU/GPUTracking/Base/hip/CMakeLists.txt b/GPU/GPUTracking/Base/hip/CMakeLists.txt index 04a65922ad453..82922382deddc 100644 --- a/GPU/GPUTracking/Base/hip/CMakeLists.txt +++ b/GPU/GPUTracking/Base/hip/CMakeLists.txt @@ -223,29 +223,33 @@ endif() if(GPUCA_HIP_COMPILE_MODE STREQUAL "onefile") target_compile_definitions(${targetName} PRIVATE GPUCA_KERNEL_COMPILE_MODE=0) elseif(GPUCA_HIP_COMPILE_MODE STREQUAL "perkernel") - add_library(GPUTrackingHIPKernels OBJECT $,REPLACE,[^A-Za-z0-9]+,_>,PREPEND,${O2_GPU_KERNEL_WRAPPER_FOLDER}/krnl_>,APPEND,.hip>, >) - target_compile_options(GPUTrackingHIPKernels PRIVATE "--cuda-device-only") - target_compile_options(GPUTrackingHIPKernels PRIVATE $<$:-fno-gpu-rdc>) - target_link_options(GPUTrackingHIPKernels PRIVATE $<$:-fno-gpu-rdc>) target_compile_definitions(${targetName} PRIVATE GPUCA_KERNEL_COMPILE_MODE=1) - target_compile_definitions(GPUTrackingHIPKernels PRIVATE $) - target_include_directories(GPUTrackingHIPKernels PRIVATE $) - target_link_libraries(GPUTrackingHIPKernels PRIVATE $) - if(NOT DEFINED GPUCA_HIP_HIPIFY_FROM_CUDA OR "${GPUCA_HIP_HIPIFY_FROM_CUDA}") - add_dependencies(GPUTrackingHIPKernels ${MODULE}_HIPIFIED) + if(NOT DEFINED GPUCA_RTC_NO_COMPILED_KERNELS OR NOT GPUCA_RTC_NO_COMPILED_KERNELS) + add_library(GPUTrackingHIPKernels OBJECT $,REPLACE,[^A-Za-z0-9]+,_>,PREPEND,${O2_GPU_KERNEL_WRAPPER_FOLDER}/krnl_>,APPEND,.hip>, >) + target_compile_options(GPUTrackingHIPKernels PRIVATE "--cuda-device-only") + target_compile_options(GPUTrackingHIPKernels PRIVATE $<$:-fno-gpu-rdc>) + target_link_options(GPUTrackingHIPKernels PRIVATE $<$:-fno-gpu-rdc>) + target_compile_definitions(GPUTrackingHIPKernels PRIVATE $) + target_include_directories(GPUTrackingHIPKernels PRIVATE $) + target_link_libraries(GPUTrackingHIPKernels PRIVATE $) + if(NOT DEFINED GPUCA_HIP_HIPIFY_FROM_CUDA OR "${GPUCA_HIP_HIPIFY_FROM_CUDA}") + add_dependencies(GPUTrackingHIPKernels ${MODULE}_HIPIFIED) + endif() + file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/hip_kernel_module_fatbin) + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/GPUTrackingHIPKernelModules.o + COMMAND cp -u $ ${CMAKE_CURRENT_BINARY_DIR}/hip_kernel_module_fatbin/ + COMMAND ${CMAKE_LINKER} -z noexecstack --relocatable --format binary --output ${CMAKE_CURRENT_BINARY_DIR}/GPUTrackingHIPKernelModules.o $>,PREPEND,${CMAKE_CURRENT_BINARY_DIR}/hip_kernel_module_fatbin/>,${CMAKE_CURRENT_BINARY_DIR}> + DEPENDS GPUTrackingHIPKernels $ + COMMENT "Compiling fatbin kernels ${CMAKE_CURRENT_BINARY_DIR}/GPUTrackingHIPKernelModules.o" + VERBATIM + COMMAND_EXPAND_LISTS + ) + target_sources(${targetName} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/GPUTrackingHIPKernelModules.o) + set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/GPUTrackingHIPKernelModules.o PROPERTIES EXTERNAL_OBJECT true GENERATED true) + else() + set_source_files_properties(${GPUCA_HIP_SOURCE_DIR}/GPUReconstructionHIP.hip PROPERTIES COMPILE_DEFINITIONS GPUCA_RTC_NO_COMPILED_KERNELS) endif() - file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/hip_kernel_module_fatbin) - add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/GPUTrackingHIPKernelModules.o - COMMAND cp -u $ ${CMAKE_CURRENT_BINARY_DIR}/hip_kernel_module_fatbin/ - COMMAND ${CMAKE_LINKER} -z noexecstack --relocatable --format binary --output ${CMAKE_CURRENT_BINARY_DIR}/GPUTrackingHIPKernelModules.o $>,PREPEND,${CMAKE_CURRENT_BINARY_DIR}/hip_kernel_module_fatbin/>,${CMAKE_CURRENT_BINARY_DIR}> - DEPENDS GPUTrackingHIPKernels $ - COMMENT "Compiling fatbin kernels ${CMAKE_CURRENT_BINARY_DIR}/GPUTrackingHIPKernelModules.o" - VERBATIM - COMMAND_EXPAND_LISTS - ) - target_sources(${targetName} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/GPUTrackingHIPKernelModules.o) - set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/GPUTrackingHIPKernelModules.o PROPERTIES EXTERNAL_OBJECT true GENERATED true) elseif(GPUCA_HIP_COMPILE_MODE STREQUAL "rdc") message(FATAL_ERROR "HIP RDC compilation of GPUReconstruction ios not yet working!") diff --git a/GPU/GPUTracking/Definitions/GPUSettingsList.h b/GPU/GPUTracking/Definitions/GPUSettingsList.h index 060c8495c1834..f7ff14ea188c4 100644 --- a/GPU/GPUTracking/Definitions/GPUSettingsList.h +++ b/GPU/GPUTracking/Definitions/GPUSettingsList.h @@ -556,7 +556,8 @@ AddOption(nEvents, int32_t, -1, "", 'n', "Number of events to process (-1; all)" AddOption(runs, int32_t, 1, "runs", 'r', "Number of iterations to perform (repeat each event)", min(0)) AddOption(runs2, int32_t, 1, "runsExternal", 0, "Number of iterations to perform (repeat full processing)", min(1)) AddOption(runsInit, int32_t, 1, "", 0, "Number of initial iterations excluded from average", min(0)) -AddOption(eventsDir, const char*, "pp", "events", 'e', "Directory with events to process", message("Reading events from Directory events/%s")) +AddOption(eventsDir, const char*, "pp", "events", 'e', "Directory with events to process", message("Reading events from Directory %s")) +AddOption(absoluteEventsDir, bool, false, "", 0, "Events directory is absolute, and not inside './events/'") AddOption(noEvents, bool, false, "", 0, "Run without data (e.g. for field visualization)") AddOption(eventDisplay, int32_t, 0, "display", 'd', "Show standalone event display", def(1)) AddOption(eventGenerator, bool, false, "", 0, "Run event generator") diff --git a/GPU/GPUTracking/Standalone/Benchmark/standalone.cxx b/GPU/GPUTracking/Standalone/Benchmark/standalone.cxx index 5277195752c56..95997a30034c9 100644 --- a/GPU/GPUTracking/Standalone/Benchmark/standalone.cxx +++ b/GPU/GPUTracking/Standalone/Benchmark/standalone.cxx @@ -74,6 +74,7 @@ extern GPUSettingsStandalone configStandalone; GPUReconstruction *rec, *recAsync, *recPipeline; GPUChainTracking *chainTracking, *chainTrackingAsync, *chainTrackingPipeline; GPUChainITS *chainITS, *chainITSAsync, *chainITSPipeline; +std::string eventsDir; void unique_ptr_aligned_delete(char* v) { operator delete(v, std::align_val_t(GPUCA_BUFFER_ALIGNMENT)); @@ -277,21 +278,19 @@ int32_t ReadConfiguration(int argc, char** argv) int32_t SetupReconstruction() { if (!configStandalone.eventGenerator) { - char filename[256]; - snprintf(filename, 256, "events/%s/", configStandalone.eventsDir); if (configStandalone.noEvents) { - configStandalone.eventsDir = "NON_EXISTING"; + eventsDir = "NON_EXISTING"; configStandalone.rundEdx = false; - } else if (rec->ReadSettings(filename)) { + } else if (rec->ReadSettings(eventsDir.c_str())) { printf("Error reading event config file\n"); return 1; } - printf("Read event settings from dir %s (solenoidBz: %f, constBz %d, maxTimeBin %d)\n", filename, rec->GetGRPSettings().solenoidBzNominalGPU, (int32_t)rec->GetGRPSettings().constBz, rec->GetGRPSettings().grpContinuousMaxTimeBin); + printf("Read event settings from dir %s (solenoidBz: %f, constBz %d, maxTimeBin %d)\n", eventsDir.c_str(), rec->GetGRPSettings().solenoidBzNominalGPU, (int32_t)rec->GetGRPSettings().constBz, rec->GetGRPSettings().grpContinuousMaxTimeBin); if (configStandalone.testSyncAsync) { - recAsync->ReadSettings(filename); + recAsync->ReadSettings(eventsDir.c_str()); } if (configStandalone.proc.doublePipeline) { - recPipeline->ReadSettings(filename); + recPipeline->ReadSettings(eventsDir.c_str()); } } @@ -504,23 +503,19 @@ int32_t SetupReconstruction() int32_t ReadEvent(int32_t n) { - char filename[256]; - snprintf(filename, 256, "events/%s/" GPUCA_EVDUMP_FILE ".%d.dump", configStandalone.eventsDir, n); if (configStandalone.inputcontrolmem && !configStandalone.preloadEvents) { rec->SetInputControl(inputmemory.get(), configStandalone.inputcontrolmem); } - int32_t r = chainTracking->ReadData(filename); + int32_t r = chainTracking->ReadData((eventsDir + GPUCA_EVDUMP_FILE "." + std::to_string(n) + ".dump").c_str()); if (r) { return r; } #if defined(GPUCA_TPC_GEOMETRY_O2) && defined(GPUCA_BUILD_QA) && !defined(GPUCA_O2_LIB) if ((configStandalone.proc.runQA || configStandalone.eventDisplay) && !configStandalone.QA.noMC) { chainTracking->ForceInitQA(); - snprintf(filename, 256, "events/%s/mc.%d.dump", configStandalone.eventsDir, n); chainTracking->GetQA()->UpdateChain(chainTracking); - if (chainTracking->GetQA()->ReadO2MCData(filename)) { - snprintf(filename, 256, "events/%s/mc.%d.dump", configStandalone.eventsDir, 0); - if (chainTracking->GetQA()->ReadO2MCData(filename) && configStandalone.proc.runQA) { + if (chainTracking->GetQA()->ReadO2MCData((eventsDir + "mc." + std::to_string(n) + ".dump").c_str())) { + if (chainTracking->GetQA()->ReadO2MCData((eventsDir + "mc.0.dump").c_str()) && configStandalone.proc.runQA) { throw std::runtime_error("Error reading O2 MC dump"); } } @@ -725,6 +720,7 @@ int32_t main(int argc, char** argv) if (ReadConfiguration(argc, argv)) { return 1; } + eventsDir = std::string(configStandalone.absoluteEventsDir ? "" : "events/") + configStandalone.eventsDir + "/"; GPUSettingsDeviceBackend deviceSet; deviceSet.deviceType = configStandalone.runGPU ? GPUDataTypes::GetDeviceType(configStandalone.gpuType.c_str()) : GPUDataTypes::DeviceType::CPU; @@ -787,9 +783,7 @@ int32_t main(int argc, char** argv) for (nEventsInDirectory = 0; true; nEventsInDirectory++) { std::ifstream in; - char filename[256]; - snprintf(filename, 256, "events/%s/" GPUCA_EVDUMP_FILE ".%d.dump", configStandalone.eventsDir, nEventsInDirectory); - in.open(filename, std::ifstream::binary); + in.open((eventsDir + GPUCA_EVDUMP_FILE "." + std::to_string(nEventsInDirectory) + ".dump").c_str(), std::ifstream::binary); if (in.fail()) { break; } @@ -801,7 +795,7 @@ int32_t main(int argc, char** argv) } if (configStandalone.eventGenerator) { - genEvents::RunEventGenerator(chainTracking); + genEvents::RunEventGenerator(chainTracking, eventsDir); return 0; } @@ -811,7 +805,7 @@ int32_t main(int argc, char** argv) } else { if (nEvents == -1 || nEvents > nEventsInDirectory) { if (nEvents >= 0) { - printf("Only %d events available in directors %s (%d events requested)\n", nEventsInDirectory, configStandalone.eventsDir, nEvents); + printf("Only %d events available in directory %s (%d events requested)\n", nEventsInDirectory, eventsDir.c_str(), nEvents); } nEvents = nEventsInDirectory; } diff --git a/GPU/GPUTracking/Standalone/cmake/config.cmake b/GPU/GPUTracking/Standalone/cmake/config.cmake index 0c7544aff7035..77ce9c9e77fca 100644 --- a/GPU/GPUTracking/Standalone/cmake/config.cmake +++ b/GPU/GPUTracking/Standalone/cmake/config.cmake @@ -35,6 +35,7 @@ set(HIP_AMDGPUTARGET "default") # "gfx906;gfx908;gfx90a" set(CUDA_COMPUTETARGET "default") # 86 89 #set(GPUCA_CUDA_COMPILE_MODE perkernel) # onefile / perkernel / rtc #set(GPUCA_HIP_COMPILE_MODE perkernel) +#set(GPUCA_RTC_NO_COMPILED_KERNELS 1) #set(GPUCA_KERNEL_RESOURCE_USAGE_VERBOSE 1) #set(GPUCA_CONFIG_COMPILER gcc) # gcc / clang #add_definitions(-DGPUCA_GPU_DEBUG_PRINT) diff --git a/GPU/GPUTracking/qa/genEvents.cxx b/GPU/GPUTracking/qa/genEvents.cxx index ea8a1976c1e5a..6832e48fe17da 100644 --- a/GPU/GPUTracking/qa/genEvents.cxx +++ b/GPU/GPUTracking/qa/genEvents.cxx @@ -149,7 +149,7 @@ void genEvents::FinishEventGenerator() } } -int32_t genEvents::GenerateEvent(const GPUParam& param, char* filename) +int32_t genEvents::GenerateEvent(const GPUParam& param, const char* filename) { mRec->ClearIOPointers(); static int32_t iEvent = -1; @@ -354,20 +354,17 @@ int32_t genEvents::GenerateEvent(const GPUParam& param, char* filename) return (0); } -void genEvents::RunEventGenerator(GPUChainTracking* rec) +void genEvents::RunEventGenerator(GPUChainTracking* rec, const std::string& dir) { std::unique_ptr gen(new genEvents(rec)); - char dirname[256]; - snprintf(dirname, 256, "events/%s/", configStandalone.eventsDir); - mkdir(dirname, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); - rec->DumpSettings(dirname); + mkdir(dir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); + rec->DumpSettings(dir.c_str()); gen->InitEventGenerator(); for (int32_t i = 0; i < (configStandalone.nEvents == -1 ? 10 : configStandalone.nEvents); i++) { GPUInfo("Generating event %d/%d", i, configStandalone.nEvents == -1 ? 10 : configStandalone.nEvents); - snprintf(dirname, 256, "events/%s/" GPUCA_EVDUMP_FILE ".%d.dump", configStandalone.eventsDir, i); - gen->GenerateEvent(rec->GetParam(), dirname); + gen->GenerateEvent(rec->GetParam(), (dir + GPUCA_EVDUMP_FILE "." + std::to_string(i) + ".dump").c_str()); } gen->FinishEventGenerator(); } diff --git a/GPU/GPUTracking/qa/genEvents.h b/GPU/GPUTracking/qa/genEvents.h index 43b946e6238b2..abf1742b48e88 100644 --- a/GPU/GPUTracking/qa/genEvents.h +++ b/GPU/GPUTracking/qa/genEvents.h @@ -28,10 +28,10 @@ class genEvents public: genEvents(GPUChainTracking* rec) {} void InitEventGenerator() {} - int32_t GenerateEvent(const GPUParam& sectorParam, char* filename) { return 1; } + int32_t GenerateEvent(const GPUParam& sectorParam, const char* filename) { return 1; } void FinishEventGenerator() {} - static void RunEventGenerator(GPUChainTracking* rec) {}; + static void RunEventGenerator(GPUChainTracking* rec, const std::string& dir) {}; }; #else @@ -41,10 +41,10 @@ class genEvents public: genEvents(GPUChainTracking* rec) : mRec(rec) {} void InitEventGenerator(); - int32_t GenerateEvent(const GPUParam& sectorParam, char* filename); + int32_t GenerateEvent(const GPUParam& sectorParam, const char* filename); void FinishEventGenerator(); - static void RunEventGenerator(GPUChainTracking* rec); + static void RunEventGenerator(GPUChainTracking* rec, const std::string& dir); private: int32_t GetSector(double GlobalPhi);