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 ()
0 commit comments