Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 21 additions & 3 deletions GPU/GPUTracking/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,25 @@ set(SRCS_NO_H SectorTracker/GPUTPCTrackerDump.cxx
Global/GPUChainTrackingDebugAndProfiling.cxx
Global/GPUChainTrackingIO.cxx)

if(GPUCA_OVERRIDE_PARAMETER_FILE)
set(GPU_PARAM_JSON ${GPUCA_OVERRIDE_PARAMETER_FILE})
else()
set(GPU_PARAM_JSON ${CMAKE_CURRENT_SOURCE_DIR}/Definitions/Parameters/GPUParameters.csv)
endif()
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${GPU_PARAM_JSON}")

get_filename_component(GPU_PARAM_JSON_EXT ${GPU_PARAM_JSON} EXT)
string(TOLOWER "${GPU_PARAM_JSON_EXT}" GPU_PARAM_JSON_EXT)
if(GPU_PARAM_JSON_EXT STREQUAL .csv)
execute_process(
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/Definitions/Parameters/csv_to_json.sh "${GPU_PARAM_JSON}"
OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/gpu_parameters.json
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
message(STATUS "Converted ${GPU_PARAM_JSON} to ${CMAKE_CURRENT_BINARY_DIR}/gpu_parameters.json")
set(GPU_PARAM_JSON ${CMAKE_CURRENT_BINARY_DIR}/gpu_parameters.json)
endif()

set(ON_THE_FLY_DIR ${CMAKE_CURRENT_BINARY_DIR}/include_gpu_onthefly)
file(MAKE_DIRECTORY ${ON_THE_FLY_DIR})
include(cmake/gpu_param_header_generator.cmake)
Expand Down Expand Up @@ -410,12 +429,11 @@ target_sources(${targetName}
BASE_DIRS ${CMAKE_CURRENT_BINARY_DIR})

make_directory(${CMAKE_CURRENT_BINARY_DIR}/genGPUArch)
set(GPU_CONST_PARAM_ARCHITECTUES AMPERE TURING VEGA MI100)
set(GPU_CONST_PARAM_FILES "")
set(GPU_ARCH_PARAMS_HEADER ${CMAKE_CURRENT_BINARY_DIR}/genGPUArch/GPUDefParametersDefaults_OnTheFly.h)
generate_gpu_param_header("ALL" ${GPU_ARCH_PARAMS_HEADER} "GPU_CONST_PARAM_ARCHITECTUES")
foreach(GPU_ARCH ${GPU_CONST_PARAM_ARCHITECTUES})
set(PARAMFILE ${CMAKE_CURRENT_BINARY_DIR}/genGPUArch/gpu_const_param_${GPU_ARCH}.par)
set(GPU_ARCH_PARAMS_HEADER ${CMAKE_CURRENT_BINARY_DIR}/genGPUArch/GPUDefParametersDefaults_${GPU_ARCH}.h)
generate_gpu_param_header(${GPU_ARCH} ${GPU_ARCH_PARAMS_HEADER})
add_custom_command(
OUTPUT ${PARAMFILE}
COMMAND bash -c
Expand Down
113 changes: 113 additions & 0 deletions GPU/GPUTracking/Definitions/Parameters/GPUParameters.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
Architecture,default,MI100,VEGA,TAHITI,TESLA,FERMI,PASCAL,KEPLER,AMPERE,TURING,default_cpu
,,,,,,,,,,,
CORE:,,,,,,,,,,,
WARP_SIZE,32,64,64,32,32,32,32,32,32,32,
THREAD_COUNT_DEFAULT,256,256,256,,,,,,512,512,
,,,,,,,,,,,
LB:,,,,,,,,,,,
GPUTPCCreateTrackingData,256,"[256, 7]","[192, 2]",,,,,,384,256,
GPUTPCTrackletConstructor,256,"[768, 8]","[512, 10]","[256, 2]","[256, 1]","[256, 2]","[1024, 2]","[512, 4]","[256, 2]","[256, 2]",
GPUTPCTrackletSelector,256,"[384, 5]","[192, 10]","[256, 3]","[256, 1]","[256, 3]","[512, 4]","[256, 3]","[192, 3]","[192, 3]",
GPUTPCNeighboursFinder,256,"[192, 8]","[960, 8]",256,256,256,512,256,"[640, 1]","[640, 1]",
GPUTPCNeighboursCleaner,256,"[128, 5]","[384, 9]",256,256,256,256,256,512,512,
GPUTPCExtrapolationTracking,256,"[256, 7]","[256, 2]",,,,,,"[128, 4]","[192, 2]",
GPUTRDTrackerKernels_gpuVersion,512,,,,,,,,,,
GPUTPCCreateOccupancyMap_fill,256,,,,,,,,,,
GPUTPCCreateOccupancyMap_fold,256,,,,,,,,,,
GPUTRDTrackerKernels_o2Version,512,,,,,,,,,,
GPUTPCCompressionKernels_step0attached,256,"[128, 1]","[64, 2]",,,,,,"[64, 2]",128,
GPUTPCCompressionKernels_step1unattached,256,"[512, 2]","[512, 2]",,,,,,"[512, 3]","[512, 2]",
GPUTPCDecompressionKernels_step0attached,256,"[128, 2]","[128, 2]",,,,,,"[32, 1]","[32, 1]",
GPUTPCDecompressionKernels_step1unattached,256,"[64, 2]","[64, 2]",,,,,,"[32, 1]","[32, 1]",
GPUTPCDecompressionUtilKernels_sortPerSectorRow,256,,,,,,,,,,
GPUTPCDecompressionUtilKernels_countFilteredClusters,256,,,,,,,,,,
GPUTPCDecompressionUtilKernels_storeFilteredClusters,256,,,,,,,,,,
GPUTPCCFDecodeZS,"[128, 4]","[64, 4]","[64, 1]",,,,,,"[64, 10]","[64, 8]",
GPUTPCCFDecodeZSLink,"""GPUCA_WARP_SIZE""","""GPUCA_WARP_SIZE""","""GPUCA_WARP_SIZE""",,,,,,"""GPUCA_WARP_SIZE""","""GPUCA_WARP_SIZE""",
GPUTPCCFDecodeZSDenseLink,"""GPUCA_WARP_SIZE""","[""GPUCA_WARP_SIZE"", 4]","[""GPUCA_WARP_SIZE"", 14]",,,,,,"""GPUCA_WARP_SIZE""","""GPUCA_WARP_SIZE""",
GPUTPCCFGather,"[1024, 1]","[1024, 5]","[1024, 1]",,,,,,"[1024, 1]","[1024, 1]",
COMPRESSION_GATHER,1024,1024,1024,,,,,,1024,1024,
GPUTPCGMMergerTrackFit,256,"[192, 2]","[64, 7]",,,,,,"[64, 4]","[32, 8]",
GPUTPCGMMergerFollowLoopers,256,"[256, 5]","[256, 4]",,,,,,"[64, 12]","[128, 4]",
GPUTPCGMMergerSectorRefit,256,"[64, 4]","[256, 2]",,,,,,"[32, 6]","[64, 5]",
GPUTPCGMMergerUnpackResetIds,256,256,256,,,,,,256,256,
GPUTPCGMMergerUnpackGlobal,256,256,256,,,,,,256,256,
GPUTPCGMMergerResolve_step0,256,512,256,,,,,,256,256,
GPUTPCGMMergerResolve_step1,256,512,256,,,,,,256,256,
GPUTPCGMMergerResolve_step2,256,512,256,,,,,,256,256,
GPUTPCGMMergerResolve_step3,256,512,256,,,,,,256,256,
GPUTPCGMMergerResolve_step4,256,512,256,,,,,,"[256, 4]","[256, 4]",
GPUTPCGMMergerClearLinks,256,256,256,,,,,,256,256,
GPUTPCGMMergerMergeWithinPrepare,256,256,256,,,,,,256,256,
GPUTPCGMMergerMergeSectorsPrepare,256,256,256,,,,,,"[256, 2]","[256, 2]",
GPUTPCGMMergerMergeBorders_step0,256,512,256,,,,,,192,192,
GPUTPCGMMergerMergeBorders_step2,256,512,256,,,,,,"[64, 2]",256,
GPUTPCGMMergerMergeCE,256,512,256,,,,,,256,256,
GPUTPCGMMergerLinkExtrapolatedTracks,256,256,256,,,,,,256,256,
GPUTPCGMMergerCollect,256,"[768, 1]","[1024, 1]",,,,,,"[256, 2]","[128, 2]",
GPUTPCGMMergerSortTracksPrepare,256,256,256,,,,,,256,256,
GPUTPCGMMergerPrepareForFit_step0,256,256,256,,,,,,256,256,
GPUTPCGMMergerPrepareForFit_step1,256,256,256,,,,,,256,256,
GPUTPCGMMergerPrepareForFit_step2,256,256,256,,,,,,256,256,
GPUTPCGMMergerFinalize_step0,256,,256,,,,,,,,
GPUTPCGMMergerFinalize_step1,256,,256,,,,,,,,
GPUTPCGMMergerFinalize_step2,256,,256,,,,,,,,
GPUTPCGMMergerMergeLoopers_step0,256,,,,,,,,,,
GPUTPCGMMergerMergeLoopers_step1,256,,,,,,,,,,
GPUTPCGMMergerMergeLoopers_step2,256,,,,,,,,,,
GPUTPCGMO2Output_prepare,256,,,,,,,,,,
GPUTPCGMO2Output_output,256,,,,,,,,,,
GPUTPCStartHitsFinder,256,"[1024, 2]","[1024, 7]",256,256,256,256,256,512,512,
GPUTPCStartHitsSorter,256,"[1024, 5]","[512, 7]",256,256,256,256,256,"[512, 1]","[512, 1]",
GPUTPCCFCheckPadBaseline,576,"[576, 2]","[576, 2]",,,,,,"[576, 2]",,
GPUTPCCFChargeMapFiller_fillIndexMap,512,512,512,,,,,,448,,
GPUTPCCFChargeMapFiller_fillFromDigits,512,512,512,,,,,,448,,
GPUTPCCFChargeMapFiller_findFragmentStart,512,512,512,,,,,,448,,
GPUTPCCFPeakFinder,512,"[512, 9]","[512, 4]",,,,,,128,,
GPUTPCCFNoiseSuppression,512,512,512,,,,,,448,,
GPUTPCCFDeconvolution,512,"[512, 5]","[512, 5]",,,,,,384,,
GPUTPCCFClusterizer,512,"[448, 3]","[512, 2]",,,,,,448,,
GPUTPCNNClusterizerKernels,512,,,,,,,,,,
GPUTrackingRefitKernel_mode0asGPU,256,,,,,,,,,,
GPUTrackingRefitKernel_mode1asTrackParCov,256,,,,,,,,,,
GPUMemClean16,"[""GPUCA_THREAD_COUNT_DEFAULT"", 1]",,,,,,,,,,
GPUitoa,"[""GPUCA_THREAD_COUNT_DEFAULT"", 1]",,,,,,,,,,
GPUTPCCFNoiseSuppression_noiseSuppression,"""GPUCA_LB_GPUTPCCFNoiseSuppression""",,,,,,,,,,
GPUTPCCFNoiseSuppression_updatePeaks,"""GPUCA_LB_GPUTPCCFNoiseSuppression""",,,,,,,,,,
GPUTPCNNClusterizerKernels_runCfClusterizer,"""GPUCA_LB_GPUTPCNNClusterizerKernels""",,,,,,,,,,
GPUTPCNNClusterizerKernels_fillInputNNCPU,"""GPUCA_LB_GPUTPCNNClusterizerKernels""",,,,,,,,,,
GPUTPCNNClusterizerKernels_fillInputNNGPU,1024,,,,,,,,,,
GPUTPCNNClusterizerKernels_determineClass1Labels,"""GPUCA_LB_GPUTPCNNClusterizerKernels""",,,,,,,,,,
GPUTPCNNClusterizerKernels_determineClass2Labels,"""GPUCA_LB_GPUTPCNNClusterizerKernels""",,,,,,,,,,
GPUTPCNNClusterizerKernels_publishClass1Regression,"""GPUCA_LB_GPUTPCNNClusterizerKernels""",,,,,,,,,,
GPUTPCNNClusterizerKernels_publishClass2Regression,"""GPUCA_LB_GPUTPCNNClusterizerKernels""",,,,,,,,,,
GPUTPCNNClusterizerKernels_publishDeconvolutionFlags,"""GPUCA_LB_GPUTPCNNClusterizerKernels""",,,,,,,,,,
GPUTPCCFStreamCompaction_scanStart,"""GPUCA_PAR_CF_SCAN_WORKGROUP_SIZE""",,,,,,,,,,
GPUTPCCFStreamCompaction_scanUp,"""GPUCA_PAR_CF_SCAN_WORKGROUP_SIZE""",,,,,,,,,,
GPUTPCCFStreamCompaction_scanTop,"""GPUCA_PAR_CF_SCAN_WORKGROUP_SIZE""",,,,,,,,,,
GPUTPCCFStreamCompaction_scanDown,"""GPUCA_PAR_CF_SCAN_WORKGROUP_SIZE""",,,,,,,,,,
GPUTPCCFStreamCompaction_compactDigits,"""GPUCA_PAR_CF_SCAN_WORKGROUP_SIZE""",,,,,,,,,,
GPUTPCCompressionGatherKernels_unbuffered,"""GPUCA_LB_COMPRESSION_GATHER""",,,,,,,,,,
GPUTPCCompressionGatherKernels_buffered32,"""GPUCA_LB_COMPRESSION_GATHER""",,,,,,,,,,
GPUTPCCompressionGatherKernels_buffered64,"""GPUCA_LB_COMPRESSION_GATHER""",,,,,,,,,,
GPUTPCCompressionGatherKernels_buffered128,"""GPUCA_LB_COMPRESSION_GATHER""",,,,,,,,,,
GPUTPCCompressionGatherKernels_multiBlock,"""GPUCA_LB_COMPRESSION_GATHER""",,,,,,,,,,
GPUTPCGMMergerFinalize_0,256,256,,,,,,,256,256,
GPUTPCGMMergerFinalize_1,256,256,,,,,,,256,256,
GPUTPCGMMergerFinalize_2,256,256,,,,,,,256,256,
,,,,,,,,,,,
PAR:,,,,,,,,,,,
AMD_EUS_PER_CU,0,4,4,,,,,,,,0
SORT_STARTHITS,1,,,,,,,,,,0
NEIGHBOURS_FINDER_MAX_NNEIGHUP,6,10,4,,,,,,4,4,0
NEIGHBOURS_FINDER_UNROLL_GLOBAL,4,4,2,,,,,,,,0
NEIGHBOURS_FINDER_UNROLL_SHARED,1,0,0,,,,,,,,0
TRACKLET_SELECTOR_HITS_REG_SIZE,12,9,27,,,,,,20,20,0
ALTERNATE_BORDER_SORT,0,1,1,,,,,,1,1,0
SORT_BEFORE_FIT,0,1,1,,,,,,1,1,0
NO_ATOMIC_PRECHECK,0,1,1,,,,,,1,1,0
DEDX_STORAGE_TYPE,"""float""","""uint16_t""","""uint16_t""",,,,,,"""uint16_t""","""uint16_t""","""float"""
MERGER_INTERPOLATION_ERROR_TYPE,"""float""","""half""","""half""",,,,,,"""half""","""half""","""float"""
COMP_GATHER_KERNEL,0,4,4,,,,,,4,4,0
COMP_GATHER_MODE,2,3,3,,,,,,3,3,0
CF_SCAN_WORKGROUP_SIZE,512,,,,,,,,,,0
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
"CORE": {
"WARP_SIZE": {
"default": 32,
"default_cpu": 1,
"MI100": 64,
"VEGA": 64,
"TAHITI": 32,
Expand Down
11 changes: 8 additions & 3 deletions GPU/GPUTracking/Definitions/Parameters/csv_to_json.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,13 @@

[[ -z $1 ]] && { echo "Usage: csv_to_json.sh CSV_FILE"; exit 1; }

awk -vFPAT='([^,]*)|(\"([^\"]|\"\")*\")' \
DELIM=$'\xFF'
sed -E \
':loop
s/^(([^"]*"[^"]*")*[^"]*),/\1'$DELIM'/;
t loop' \
$1 | \
awk -F$DELIM \
'BEGIN {
print "{"
} {
Expand Down Expand Up @@ -42,5 +48,4 @@ awk -vFPAT='([^,]*)|(\"([^\"]|\"\")*\")' \
if (paramprinted) print "\n }"
if (catprinted) print " }"
print "}"
}' \
$1
}'
1 change: 1 addition & 0 deletions GPU/GPUTracking/Standalone/cmake/config.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,4 @@ set(CUDA_COMPUTETARGET "default") # 86 89
#set(GPUCA_CONFIG_COMPILER gcc) # gcc / clang
#set(GPUCA_CONFIG_WERROR 1)
#add_definitions(-DGPUCA_GPU_DEBUG_PRINT)
#set(GPUCA_OVERRIDE_PARAMETER_FILE "foo.csv")
87 changes: 55 additions & 32 deletions GPU/GPUTracking/cmake/gpu_param_header_generator.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,12 @@
# file gpu_param_header_generator.cmake
# author Gabriele Cimador

function(generate_macros json_content header types arch_key use_ifndef_guard)
function(generate_macros json_content output types arch_list arch_list_output)
foreach(arch IN LISTS arch_list)
set(OUTPUT_TMP_${arch} "")
endforeach()
set(arch_list_output_tmp)
list(FIND arch_list "ALL" do_all_architectures)
foreach(TYPE IN LISTS types)
string(JSON n_params LENGTH "${json_content}" "${TYPE}")
math(EXPR last "${n_params} - 1")
Expand All @@ -22,8 +27,19 @@ function(generate_macros json_content header types arch_key use_ifndef_guard)
math(EXPR last_arch "${n_archs} - 1")
foreach(iArch RANGE 0 ${last_arch})
string(JSON arch MEMBER "${JSON_CONTENT}" "${TYPE}" "${param_name}" "${iArch}")
if(arch STREQUAL "${arch_key}")
string(JSON param_values GET "${JSON_CONTENT}" "${TYPE}" "${param_name}" "${arch_key}")
if(arch STREQUAL "default_cpu" AND NOT TYPE STREQUAL "PAR")
message(FATAL_ERROR "Bogus entry ${param_name} for ${arch}")
endif()
if(do_all_architectures GREATER -1)
if(arch_list_output AND NOT arch MATCHES ^default)
list(APPEND arch_list_output_tmp "${arch}")
endif()
set(list_idx 0)
else()
list(FIND arch_list "${arch}" list_idx)
endif()
if(list_idx GREATER -1)
string(JSON param_values GET "${JSON_CONTENT}" "${TYPE}" "${param_name}" "${arch}")
if(TYPE STREQUAL "LB")
set(MACRO_NAME "GPUCA_LB_${param_name}")
elseif(TYPE STREQUAL "PAR")
Expand All @@ -36,63 +52,70 @@ function(generate_macros json_content header types arch_key use_ifndef_guard)
string(REGEX REPLACE " *\\]$" "" vals "${vals}")
string(REGEX REPLACE "\"" "" vals "${vals}")
set(MACRO_DEFINITION "#define ${MACRO_NAME} ${vals}")
if(use_ifndef_guard)
if(arch MATCHES ^default)
# fallback defaults are wrapped in #ifndef
file(APPEND "${header}" "#ifndef ${MACRO_NAME}\n ${MACRO_DEFINITION}\n#endif\n\n")
string(APPEND OUTPUT_TMP_${arch} "#ifndef ${MACRO_NAME}\n ${MACRO_DEFINITION}\n#endif\n\n")
else()
file(APPEND "${header}" "${MACRO_DEFINITION}\n")
string(APPEND OUTPUT_TMP_${arch} "${MACRO_DEFINITION}\n")
endif()
endif()
endforeach()
endforeach()
endforeach()
foreach(arch IN LISTS arch_list)
set(${output}_${arch} "${OUTPUT_TMP_${arch}}" PARENT_SCOPE)
endforeach()
if(arch_list_output)
list(REMOVE_DUPLICATES arch_list_output_tmp)
list(SORT arch_list_output_tmp)
set(${arch_list_output} "${arch_list_output_tmp}" PARENT_SCOPE)
endif()
endfunction()

function(generate_gpu_param_header GPU_ARCH OUT_HEADER)
set(GPU_PARAM_JSON ${CMAKE_CURRENT_SOURCE_DIR}/Definitions/Parameters/GPUParameters.json)
set(TARGET_ARCH "UNKNOWN")
if(GPU_ARCH STREQUAL "AUTO")
detect_gpu_arch("ALL")
else()
set(TARGET_ARCH ${GPU_ARCH})
endif()
file(READ "${GPU_PARAM_JSON}" JSON_CONTENT)
set(TMP_HEADER "${OUT_HEADER}.tmp")
file(WRITE "${TMP_HEADER}" "#ifndef GPUDEFPARAMETERSDEFAULTS_H\n#define GPUDEFPARAMETERSDEFAULTS_H\n\n")
file(APPEND "${TMP_HEADER}" "// This file is auto-generated from gpu_params.json. Do not edit directly.\n")
set(TMP_HEADER "#ifndef GPUDEFPARAMETERSDEFAULTS_H\n#define GPUDEFPARAMETERSDEFAULTS_H\n\n")
string(APPEND TMP_HEADER "// This file is auto-generated from gpu_params.json. Do not edit directly.\n")
string(REPLACE "," ";" ARCH_LIST "${TARGET_ARCH}")
file(APPEND "${TMP_HEADER}" "// Architectures: ${TARGET_ARCH}\n\n")
file(APPEND "${TMP_HEADER}" "#if defined(GPUCA_GPUCODE) && !defined(GPUCA_GPUCODE_GENRTC) && !defined(GPUCA_GPUCODE_NO_LAUNCH_BOUNDS) // Avoid including for RTC generation besides normal include protection.\n\n")
string(APPEND TMP_HEADER "// Architectures: ${TARGET_ARCH}\n\n")
string(APPEND TMP_HEADER "#if defined(GPUCA_GPUCODE) && !defined(GPUCA_GPUCODE_GENRTC) && !defined(GPUCA_GPUCODE_NO_LAUNCH_BOUNDS) // Avoid including for RTC generation besides normal include protection.\n\n")

# Types
set(TYPES CORE LB PAR)
# Per architecture definitions
set(_first TRUE)
generate_macros("${JSON_CONTENT}" TMP_OUTPUT "${TYPES}" "${ARCH_LIST};default;default_cpu" "JSON_ARCHITECTURES")
list(FIND ARCH_LIST "ALL" do_all_architectures)
if(ARGC GREATER 2)
set(${ARGV2} "${JSON_ARCHITECTURES}" PARENT_SCOPE)
endif()
if(do_all_architectures GREATER -1)
set(ARCH_LIST ${JSON_ARCHITECTURES})
endif()
string(APPEND TMP_HEADER "#if 0\n")
foreach(ARCH IN LISTS ARCH_LIST)
if(_first)
file(APPEND "${TMP_HEADER}" "#if defined(GPUCA_GPUTYPE_${ARCH})\n\n")
set(_first FALSE)
else()
file(APPEND "${TMP_HEADER}" "#elif defined(GPUCA_GPUTYPE_${ARCH})\n\n")
endif()
generate_macros("${JSON_CONTENT}" "${TMP_HEADER}" "${TYPES}" "${ARCH}" "")
string(APPEND TMP_HEADER "\n#elif defined(GPUCA_GPUTYPE_${ARCH})\n")
string(APPEND TMP_HEADER ${TMP_OUTPUT_${ARCH}})
endforeach()
if(NOT _first)
file(APPEND "${TMP_HEADER}" "#else\n#error GPU TYPE NOT SET\n#endif\n")
endif()
string(APPEND TMP_HEADER "#else\n#error GPU TYPE NOT SET\n#endif\n")

# Default parameters
file(APPEND "${TMP_HEADER}" "\n// Default parameters if not defined for the target architecture\n\n")
generate_macros("${JSON_CONTENT}" "${TMP_HEADER}" "${TYPES}" "default" "use_ifndef_guard")
file(APPEND "${TMP_HEADER}" "#endif // defined(GPUCA_GPUCODE) && !defined(GPUCA_GPUCODE_GENRTC) && !defined(GPUCA_GPUCODE_NO_LAUNCH_BOUNDS)\n\n")
string(APPEND TMP_HEADER "\n// Default parameters if not defined for the target architecture\n\n")
string(APPEND TMP_HEADER ${TMP_OUTPUT_default})
string(APPEND TMP_HEADER "#endif // defined(GPUCA_GPUCODE) && !defined(GPUCA_GPUCODE_GENRTC) && !defined(GPUCA_GPUCODE_NO_LAUNCH_BOUNDS)\n\n")

# CPU fallback
file(APPEND "${TMP_HEADER}" "#ifndef GPUCA_GPUCODE_GENRTC //Defaults for non-LB parameters also for CPU fallback\n\n")
generate_macros("${JSON_CONTENT}" "${TMP_HEADER}" "PAR" "default_cpu" "use_ifndef_guard")
file(APPEND "${TMP_HEADER}" "\n#endif // GPUCA_GPUCODE_GENRTC\n")
string(APPEND TMP_HEADER "#ifndef GPUCA_GPUCODE_GENRTC // Defaults for non-LB parameters also for CPU fallback\n\n")
string(APPEND TMP_HEADER ${TMP_OUTPUT_default_cpu})
string(APPEND TMP_HEADER "\n#endif // GPUCA_GPUCODE_GENRTC\n")

file(APPEND "${TMP_HEADER}" "\n#endif // GPUDEFPARAMETERSDEFAULTS_H\n")
file(RENAME "${TMP_HEADER}" "${OUT_HEADER}")
string(APPEND TMP_HEADER "\n#endif // GPUDEFPARAMETERSDEFAULTS_H\n")
file(GENERATE OUTPUT "${OUT_HEADER}" CONTENT "${TMP_HEADER}")
message(STATUS "Generated ${OUT_HEADER}")
add_custom_target(GPU_PARAM_HEADER_${GPU_ARCH}_ALL ALL DEPENDS ${OUT_HEADER} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/gpu_param_header_generator.cmake ${GPU_PARAM_JSON})
endfunction()
endfunction()