Skip to content

Commit a97a95b

Browse files
committed
GPU Framework: refactor generation of default GPU parameters
1 parent 7c166ef commit a97a95b

File tree

7 files changed

+63
-85
lines changed

7 files changed

+63
-85
lines changed

GPU/GPUTracking/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ set(SRCS_NO_H SectorTracker/GPUTPCTrackerDump.cxx
108108

109109
set(ON_THE_FLY_DIR ${CMAKE_CURRENT_BINARY_DIR}/include_gpu_onthefly)
110110
file(MAKE_DIRECTORY ${ON_THE_FLY_DIR})
111-
include(cmake/generateGPUParamHeader.cmake)
111+
include(cmake/gpu_param_header_generator.cmake)
112112
set(GPU_DEFAULT_PARAMS_HEADER ${ON_THE_FLY_DIR}/GPUDefParametersDefaults.h)
113113
generate_gpu_param_header("AUTO" ${GPU_DEFAULT_PARAMS_HEADER}) # generate header with default GPU parameters, arch selected by CMake variables
114114

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
DisableFormat: true

GPU/GPUTracking/Definitions/.clang-format-ignore renamed to GPU/GPUTracking/Definitions/Parameters/.clang-format-ignore

File renamed without changes.
File renamed without changes.

GPU/GPUTracking/cmake/generateGPUParamHeader.cmake

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,26 +12,16 @@
1212
# file generateGPUParamHeader.cmake
1313
# author Gabriele Cimador
1414

15+
include(gpu_param_header_generator.cmake)
16+
1517
function(generate_gpu_param_header GPU_ARCH OUT_HEADER)
1618
set(GPU_PARAM_JSON ${CMAKE_SOURCE_DIR}/GPU/GPUTracking/Definitions/GPUParameters.json)
1719
set(TARGET_ARCH "UNKNOWN")
1820
if(GPU_ARCH STREQUAL "AUTO")
19-
detect_gpu_arch("AUTO")
21+
detect_gpu_arch("ALL")
2022
else()
2123
set(TARGET_ARCH ${GPU_ARCH})
2224
endif()
23-
add_custom_command(
24-
OUTPUT ${OUT_HEADER}
25-
COMMAND ${CMAKE_COMMAND}
26-
-DOUT_HEADER=${OUT_HEADER}
27-
-DGPU_PARAM_JSON=${GPU_PARAM_JSON}
28-
-DTARGET_ARCH_SHORT=${TARGET_ARCH}
29-
-P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/gpu_param_header_generator.cmake
30-
DEPENDS
31-
${CMAKE_CURRENT_SOURCE_DIR}/cmake/gpu_param_header_generator.cmake
32-
${GPU_PARAM_JSON}
33-
COMMENT "Generating GPU parameter header for ${TARGET_ARCH}"
34-
VERBATIM
35-
)
36-
add_custom_target(GPU_PARAM_HEADER_${GPU_ARCH}_ALL ALL DEPENDS ${OUT_HEADER})
25+
26+
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})
3727
endfunction()

GPU/GPUTracking/cmake/gpu_param_header_generator.cmake

Lines changed: 52 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -12,31 +12,18 @@
1212
# file gpu_param_header_generator.cmake
1313
# author Gabriele Cimador
1414

15-
file(READ "${GPU_PARAM_JSON}" JSON_CONTENT)
16-
set(TMP_HEADER "${OUT_HEADER}.tmp")
17-
file(WRITE "${TMP_HEADER}" "#ifndef GPUDEFPARAMETERSDEFAULTS_H\n#define GPUDEFPARAMETERSDEFAULTS_H\n\n")
18-
file(APPEND "${TMP_HEADER}" "// This file is auto-generated from gpu_params.json. Do not edit directly.\n")
19-
string(REPLACE "," ";" ARCH_LIST "${TARGET_ARCH_SHORT}")
20-
file(APPEND "${TMP_HEADER}" "// Architectures: ${TARGET_ARCH_SHORT}\n\n")
21-
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")
22-
23-
# Types
24-
set(TYPES CORE LB PAR)
25-
foreach(ARCH IN LISTS ARCH_LIST)
26-
file(APPEND "${TMP_HEADER}" "#if defined(GPUCA_GPUTYPE_${ARCH})\n\n")
27-
foreach(TYPE IN LISTS TYPES)
28-
# Get all keys of this TYPE as a semicolon-separated list
29-
string(JSON n_params LENGTH "${JSON_CONTENT}" "${TYPE}")
15+
function(generate_macros json_content header types arch_key use_ifndef_guard)
16+
foreach(TYPE IN LISTS types)
17+
string(JSON n_params LENGTH "${json_content}" "${TYPE}")
3018
math(EXPR last "${n_params} - 1")
3119
foreach(i RANGE 0 ${last})
32-
string(JSON param_name MEMBER "${JSON_CONTENT}" "${TYPE}" "${i}")
20+
string(JSON param_name MEMBER "${json_content}" "${TYPE}" "${i}")
3321
string(JSON n_archs LENGTH "${JSON_CONTENT}" "${TYPE}" "${param_name}")
3422
math(EXPR last_arch "${n_archs} - 1")
35-
3623
foreach(iArch RANGE 0 ${last_arch})
3724
string(JSON arch MEMBER "${JSON_CONTENT}" "${TYPE}" "${param_name}" "${iArch}")
38-
if(arch STREQUAL "${ARCH}")
39-
string(JSON param_values GET "${JSON_CONTENT}" "${TYPE}" "${param_name}" "${ARCH}")
25+
if(arch STREQUAL "${arch_key}")
26+
string(JSON param_values GET "${JSON_CONTENT}" "${TYPE}" "${param_name}" "${arch_key}")
4027
if(TYPE STREQUAL "LB")
4128
set(MACRO_NAME "GPUCA_LB_${param_name}")
4229
elseif(TYPE STREQUAL "PAR")
@@ -49,57 +36,57 @@ foreach(ARCH IN LISTS ARCH_LIST)
4936
string(REGEX REPLACE " *\\]$" "" vals "${vals}")
5037
string(REGEX REPLACE "\"" "" vals "${vals}")
5138
set(MACRO_DEFINITION "#define ${MACRO_NAME} ${vals}")
52-
file(APPEND "${TMP_HEADER}" "${MACRO_DEFINITION}\n")
39+
if(use_ifndef_guard)
40+
# fallback defaults are wrapped in #ifndef
41+
file(APPEND "${header}" "#ifndef ${MACRO_NAME}\n ${MACRO_DEFINITION}\n#endif\n\n")
42+
else()
43+
file(APPEND "${header}" "${MACRO_DEFINITION}\n")
44+
endif()
5345
endif()
5446
endforeach()
5547
endforeach()
5648
endforeach()
57-
file(APPEND "${TMP_HEADER}" "\n#endif // GPUCA_GPUTYPE_${ARCH}\n\n")
58-
endforeach()
49+
endfunction()
50+
51+
function(generate_gpu_param_header GPU_ARCH OUT_HEADER)
52+
set(GPU_PARAM_JSON ${CMAKE_SOURCE_DIR}/GPU/GPUTracking/Definitions/Parameters/GPUParameters.json)
53+
set(TARGET_ARCH "UNKNOWN")
54+
if(GPU_ARCH STREQUAL "AUTO")
55+
detect_gpu_arch("ALL")
56+
else()
57+
set(TARGET_ARCH ${GPU_ARCH})
58+
endif()
59+
file(READ "${GPU_PARAM_JSON}" JSON_CONTENT)
60+
set(TMP_HEADER "${OUT_HEADER}.tmp")
61+
message(STATUS "OUT_HEADER = '${OUT_HEADER}'")
62+
message(STATUS "TMP_HEADER = '${TMP_HEADER}'")
63+
file(WRITE "${TMP_HEADER}" "#ifndef GPUDEFPARAMETERSDEFAULTS_H\n#define GPUDEFPARAMETERSDEFAULTS_H\n\n")
64+
file(APPEND "${TMP_HEADER}" "// This file is auto-generated from gpu_params.json. Do not edit directly.\n")
65+
string(REPLACE "," ";" ARCH_LIST "${TARGET_ARCH}")
66+
file(APPEND "${TMP_HEADER}" "// Architectures: ${TARGET_ARCH}\n\n")
67+
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")
5968

60-
file(APPEND "${TMP_HEADER}" "\n// Default parameters if not defined for the target architecture\n\n")
61-
#Default parameters
62-
foreach(TYPE IN LISTS TYPES)
63-
# Get all keys of this TYPE as a semicolon-separated list
64-
string(JSON n_params LENGTH "${JSON_CONTENT}" "${TYPE}")
65-
math(EXPR last "${n_params} - 1")
66-
foreach(i RANGE 0 ${last})
67-
string(JSON param_name MEMBER "${JSON_CONTENT}" "${TYPE}" "${i}")
68-
string(JSON param_values GET "${JSON_CONTENT}" "${TYPE}" "${param_name}" "default")
69-
if(TYPE STREQUAL "LB")
70-
set(MACRO_NAME "GPUCA_LB_${param_name}")
71-
elseif(TYPE STREQUAL "PAR")
72-
set(MACRO_NAME "GPUCA_PAR_${param_name}")
73-
else()
74-
set(MACRO_NAME "GPUCA_${param_name}")
75-
endif()
76-
set(vals "${param_values}")
77-
string(REGEX REPLACE "^\\[ *" "" vals "${vals}")
78-
string(REGEX REPLACE " *\\]$" "" vals "${vals}")
79-
string(REGEX REPLACE "\"" "" vals "${vals}")
80-
set(MACRO_DEFINITION "#define ${MACRO_NAME} ${vals}")
81-
file(APPEND "${TMP_HEADER}" "#ifndef ${MACRO_NAME}\n ${MACRO_DEFINITION}\n#endif\n\n")
69+
# Types
70+
set(TYPES CORE LB PAR)
71+
# Per architecture definitions
72+
foreach(ARCH IN LISTS ARCH_LIST)
73+
file(APPEND "${TMP_HEADER}" "#if defined(GPUCA_GPUTYPE_${ARCH})\n\n")
74+
generate_macros("${JSON_CONTENT}" "${TMP_HEADER}" "${TYPES}" "${ARCH}" "")
75+
file(APPEND "${TMP_HEADER}" "\n#endif // GPUCA_GPUTYPE_${ARCH}\n\n")
8276
endforeach()
83-
endforeach()
84-
file(APPEND "${TMP_HEADER}" "#endif // defined(GPUCA_GPUCODE) && !defined(GPUCA_GPUCODE_GENRTC) && !defined(GPUCA_GPUCODE_NO_LAUNCH_BOUNDS)\n\n")
8577

86-
#Defaults for non-LB parameters also for CPU fallback
87-
file(APPEND "${TMP_HEADER}" "#ifndef GPUCA_GPUCODE_GENRTC //Defaults for non-LB parameters also for CPU fallback\n\n") # Get all keys of this TYPE as a semicolon-separated list
88-
string(JSON n_params LENGTH "${JSON_CONTENT}" "PAR")
89-
math(EXPR last "${n_params} - 1")
90-
foreach(i RANGE 0 ${last})
91-
string(JSON param_name MEMBER "${JSON_CONTENT}" "PAR" "${i}")
92-
string(JSON param_values GET "${JSON_CONTENT}" "PAR" "${param_name}" "default_cpu")
93-
set(MACRO_NAME "GPUCA_PAR_${param_name}")
94-
set(vals "${param_values}")
95-
string(REGEX REPLACE "^\\[ *" "" vals "${vals}")
96-
string(REGEX REPLACE " *\\]$" "" vals "${vals}")
97-
string(REGEX REPLACE "\"" "" vals "${vals}")
98-
set(MACRO_DEFINITION "#define ${MACRO_NAME} ${vals}")
99-
file(APPEND "${TMP_HEADER}" "#ifndef ${MACRO_NAME}\n ${MACRO_DEFINITION}\n#endif\n\n")
100-
endforeach()
101-
file(APPEND "${TMP_HEADER}" "\n#endif // GPUCA_GPUCODE_GENRTC\n")
78+
# Default parameters
79+
file(APPEND "${TMP_HEADER}" "\n// Default parameters if not defined for the target architecture\n\n")
80+
generate_macros("${JSON_CONTENT}" "${TMP_HEADER}" "${TYPES}" "default" "use_ifndef_guard")
81+
file(APPEND "${TMP_HEADER}" "#endif // defined(GPUCA_GPUCODE) && !defined(GPUCA_GPUCODE_GENRTC) && !defined(GPUCA_GPUCODE_NO_LAUNCH_BOUNDS)\n\n")
82+
83+
# CPU fallback
84+
file(APPEND "${TMP_HEADER}" "#ifndef GPUCA_GPUCODE_GENRTC //Defaults for non-LB parameters also for CPU fallback\n\n") # Get all keys of this TYPE as a semicolon-separated list
85+
generate_macros("${JSON_CONTENT}" "${TMP_HEADER}" "PAR" "default_cpu" "use_ifndef_guard")
86+
file(APPEND "${TMP_HEADER}" "\n#endif // GPUCA_GPUCODE_GENRTC\n")
10287

103-
file(APPEND "${TMP_HEADER}" "\n#endif // GPUDEFPARAMETERSDEFAULTS_H\n")
104-
file(RENAME "${TMP_HEADER}" "${OUT_HEADER}")
105-
message(STATUS "Generated ${OUT_HEADER}")
88+
file(APPEND "${TMP_HEADER}" "\n#endif // GPUDEFPARAMETERSDEFAULTS_H\n")
89+
file(RENAME "${TMP_HEADER}" "${OUT_HEADER}")
90+
message(STATUS "Generated ${OUT_HEADER}")
91+
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})
92+
endfunction()

dependencies/FindO2GPU.cmake

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,6 @@ if(HIP_AMDGPUTARGET AND HIP_AMDGPUTARGET STREQUAL "default")
4545
endif()
4646

4747
function(detect_gpu_arch backend) # Detect GPU architecture, optionally filterring by backend
48-
set(TARGET_ARCH "")
49-
set(CUDA_TARGET "")
50-
set(HIP_TARGET "")
5148

5249
if(CUDA_COMPUTETARGET AND CUDA_COMPUTETARGET MATCHES "86|89")
5350
set(CUDA_TARGET AMPERE)
@@ -80,8 +77,11 @@ function(detect_gpu_arch backend) # Detect GPU architecture, optionally filterri
8077
elseif(backend STREQUAL "HIP") # HIP filter
8178
set(TARGET_ARCH "${HIP_TARGET}" PARENT_SCOPE)
8279
return()
83-
else() # Return both
80+
elseif(backend STREQUAL "ALL") # Return both
8481
set(TARGET_ARCH "${CUDA_TARGET},${HIP_TARGET}" PARENT_SCOPE)
82+
return()
83+
else()
84+
message(FATAL_ERROR "Unknown backend provided: ${backend}")
8585
endif()
8686
endfunction()
8787

0 commit comments

Comments
 (0)