diff --git a/codegen/kernel_specialization/gen_kernel_specialization.py b/codegen/kernel_specialization/gen_kernel_specialization.py deleted file mode 100644 index fe382e06c4..0000000000 --- a/codegen/kernel_specialization/gen_kernel_specialization.py +++ /dev/null @@ -1,73 +0,0 @@ -import string -import argparse -import pathlib - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - - parser.add_argument( - "template", - type=pathlib.Path, - help="the template path", - ) - - parser.add_argument( - "-o", - "--output", - type=pathlib.Path, - help="the output path to write to", - required=True, - ) - - parser.add_argument( - "--detector", - type=str, - help="the name of the detector", - ) - - parser.add_argument( - "--bfield", - type=str, - help="the name of the bfield", - ) - - parser.add_argument( - "--model", - type=str, - help="the name of the programming mode", - default="cpu", - ) - - args = parser.parse_args() - - with open(args.template, "r") as f: - src = string.Template(f.read()) - - subs = {} - - subs["SOURCE_DIR"] = args.template.parent - - det = getattr(args, "detector", None) - if det is not None: - subs["DETECTOR_NAME"] = det - - bfield = getattr(args, "bfield", None) - if bfield is not None: - # HACK: Perform some transformations to make the types line up... - # This could be resolved in the C++ file itself in the future. - bfield_name = bfield - - if args.model != "cpu" and bfield != "const": - bfield_name = args.model + "::" + bfield_name - - bfield_name += "_bfield_backend_t" - - if bfield != "inhom_texture": - bfield_name += "" - - subs["BFIELD_NAME"] = bfield_name - - result = src.substitute(subs) - - with open(args.output, "w") as f: - f.write(result) diff --git a/device/cuda/CMakeLists.txt b/device/cuda/CMakeLists.txt index 1e4e123127..0a3d804fa3 100644 --- a/device/cuda/CMakeLists.txt +++ b/device/cuda/CMakeLists.txt @@ -111,115 +111,43 @@ traccc_add_library( traccc_cuda cuda TYPE SHARED "src/fitting/kernels/fit_prelude.cu" ) -set(TRACCC_CUDA_SUPPORTED_BFIELDS "const;inhom_global;inhom_texture") - -set(KERNEL_SPECIALIZATION_PY "${PROJECT_SOURCE_DIR}/codegen/kernel_specialization/gen_kernel_specialization.py") - -# Generate specializations of find_tracks -foreach(DETECTOR_NAME ${TRACCC_SUPPORTED_DETECTORS}) - set(GENERATED_SOURCE "${CMAKE_CURRENT_BINARY_DIR}/src/finding/kernels/specializations/find_tracks_${DETECTOR_NAME}.cu") - set(TEMPLATE_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/src/finding/kernels/specializations/find_tracks.cu.template") - add_custom_command( - OUTPUT "${GENERATED_SOURCE}" - COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/src/finding/kernels/specializations/" - COMMAND - Python::Interpreter - "${KERNEL_SPECIALIZATION_PY}" - "${TEMPLATE_SOURCE}" - -o "${GENERATED_SOURCE}" - --detector "${DETECTOR_NAME}" - DEPENDS "${KERNEL_SPECIALIZATION_PY}" "${TEMPLATE_SOURCE}" - COMMENT "Generating kernel specialization of `find_tracks` for ${DETECTOR_NAME}" - ) - target_sources(traccc_cuda PRIVATE ${GENERATED_SOURCE}) -endforeach() - -# Generate specializations for apply_interaction -foreach(DETECTOR_NAME ${TRACCC_SUPPORTED_DETECTORS}) - set(GENERATED_SOURCE "${CMAKE_CURRENT_BINARY_DIR}/src/finding/kernels/specializations/apply_interaction_${DETECTOR_NAME}.cu") - set(TEMPLATE_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/src/finding/kernels/specializations/apply_interaction.cu.template") - add_custom_command( - OUTPUT "${GENERATED_SOURCE}" - COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/src/finding/kernels/specializations/" - COMMAND - Python::Interpreter - "${KERNEL_SPECIALIZATION_PY}" - "${TEMPLATE_SOURCE}" - -o "${GENERATED_SOURCE}" - --detector "${DETECTOR_NAME}" - DEPENDS "${KERNEL_SPECIALIZATION_PY}" "${TEMPLATE_SOURCE}" - COMMENT "Generating kernel specialization of `apply_interaction` for ${DETECTOR_NAME}" - ) - target_sources(traccc_cuda PRIVATE ${GENERATED_SOURCE}) -endforeach() - -# Generate specializations for propagate_to_next_surface -foreach(DETECTOR_NAME ${TRACCC_SUPPORTED_DETECTORS}) - foreach(BFIELD_NAME ${TRACCC_CUDA_SUPPORTED_BFIELDS}) - set(GENERATED_SOURCE "${CMAKE_CURRENT_BINARY_DIR}/src/finding/kernels/specializations/propagate_to_next_surface_${DETECTOR_NAME}_${BFIELD_NAME}.cu") - set(TEMPLATE_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/src/finding/kernels/specializations/propagate_to_next_surface.cu.template") - add_custom_command( - OUTPUT "${GENERATED_SOURCE}" - COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/src/finding/kernels/specializations/" - COMMAND - Python::Interpreter - "${KERNEL_SPECIALIZATION_PY}" - "${TEMPLATE_SOURCE}" - -o "${GENERATED_SOURCE}" - --detector "${DETECTOR_NAME}" - --bfield "${BFIELD_NAME}" - --model cuda - DEPENDS "${KERNEL_SPECIALIZATION_PY}" "${TEMPLATE_SOURCE}" - COMMENT "Generating kernel specialization of `propagate_to_next_surface` for ${DETECTOR_NAME} and ${BFIELD_NAME}" - ) - target_sources(traccc_cuda PRIVATE ${GENERATED_SOURCE}) - endforeach() -endforeach() - -# Generate specializations for fit_forward -foreach(DETECTOR_NAME ${TRACCC_SUPPORTED_DETECTORS}) - foreach(BFIELD_NAME ${TRACCC_CUDA_SUPPORTED_BFIELDS}) - set(GENERATED_SOURCE "${CMAKE_CURRENT_BINARY_DIR}/src/fitting/kernels/specializations/fit_forward_${DETECTOR_NAME}_${BFIELD_NAME}.cu") - set(TEMPLATE_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/src/fitting/kernels/specializations/fit_forward.cu.template") - add_custom_command( - OUTPUT "${GENERATED_SOURCE}" - COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/src/fitting/kernels/specializations/" - COMMAND - Python::Interpreter - "${KERNEL_SPECIALIZATION_PY}" - "${TEMPLATE_SOURCE}" - -o "${GENERATED_SOURCE}" - --detector "${DETECTOR_NAME}" - --bfield "${BFIELD_NAME}" - --model cuda - DEPENDS "${KERNEL_SPECIALIZATION_PY}" "${TEMPLATE_SOURCE}" - COMMENT "Generating kernel specialization of `fit_forward` for ${DETECTOR_NAME} and ${BFIELD_NAME}" - ) - target_sources(traccc_cuda PRIVATE ${GENERATED_SOURCE}) - endforeach() -endforeach() - -# Generate specializations for fit_backward +# Create a well formed postfix for the specialized filenames. +function(traccc_make_cuda_fname_postfix FNAME) + set("${FNAME}" "") + if(NOT "${DETECTOR_NAME}" STREQUAL "") + set("${FNAME}" "${${FNAME}}.${DETECTOR_NAME}") + endif() + if(NOT "${BFIELD_NAME}" STREQUAL "") + set("${FNAME}" "${${FNAME}}.${BFIELD_NAME}") + endif() + string(REPLACE "" "" "${FNAME}" "${${FNAME}}") + set("${FNAME}" "${${FNAME}}" PARENT_SCOPE) +endfunction() + +# Helper macro for adding a kernel specialization to the build of traccc::cuda. +function(traccc_add_cuda_specialization TEMPLATE_FILE) + traccc_make_cuda_fname_postfix(FNAME_POSTFIX) + configure_file("${TEMPLATE_FILE}" "${TEMPLATE_FILE}${FNAME_POSTFIX}.cu") + target_sources(traccc_cuda PRIVATE + "${CMAKE_CURRENT_BINARY_DIR}/${TEMPLATE_FILE}${FNAME_POSTFIX}.cu") +endfunction() + +# Generate specializations for the kernels. foreach(DETECTOR_NAME ${TRACCC_SUPPORTED_DETECTORS}) - foreach(BFIELD_NAME ${TRACCC_CUDA_SUPPORTED_BFIELDS}) - set(GENERATED_SOURCE "${CMAKE_CURRENT_BINARY_DIR}/src/fitting/kernels/specializations/fit_backward_${DETECTOR_NAME}_${BFIELD_NAME}.cu") - set(TEMPLATE_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/src/fitting/kernels/specializations/fit_backward.cu.template") - add_custom_command( - OUTPUT "${GENERATED_SOURCE}" - COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/src/fitting/kernels/specializations/" - COMMAND - Python::Interpreter - "${KERNEL_SPECIALIZATION_PY}" - "${TEMPLATE_SOURCE}" - -o "${GENERATED_SOURCE}" - --detector "${DETECTOR_NAME}" - --bfield "${BFIELD_NAME}" - --model cuda - DEPENDS "${KERNEL_SPECIALIZATION_PY}" "${TEMPLATE_SOURCE}" - COMMENT "Generating kernel specialization of `fit_backward` for ${DETECTOR_NAME} and ${BFIELD_NAME}" - ) - target_sources(traccc_cuda PRIVATE ${GENERATED_SOURCE}) - endforeach() + traccc_add_cuda_specialization( + "src/finding/kernels/specializations/find_tracks.cu.in") + traccc_add_cuda_specialization( + "src/finding/kernels/specializations/apply_interaction.cu.in") + foreach(BFIELD_NAME "const_bfield_backend_t" + "inhom_global_bfield_backend_t" + "inhom_texture_bfield_backend_t") + traccc_add_cuda_specialization( + "src/finding/kernels/specializations/propagate_to_next_surface.cu.in") + traccc_add_cuda_specialization( + "src/fitting/kernels/specializations/fit_forward.cu.in") + traccc_add_cuda_specialization( + "src/fitting/kernels/specializations/fit_backward.cu.in") + endforeach() endforeach() if(TRACCC_ENABLE_NVTX_PROFILING) @@ -257,6 +185,8 @@ target_compile_options( traccc_cuda target_link_libraries( traccc_cuda PUBLIC traccc::core detray::core vecmem::core PRIVATE CUDA::cudart traccc::device_common vecmem::cuda covfie::cuda ) +target_include_directories( traccc_cuda + PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}" ) # Set up Thrust specifically for the traccc::cuda library. thrust_create_target( traccc::cuda_thrust diff --git a/device/cuda/src/finding/kernels/specializations/apply_interaction.cu.template b/device/cuda/src/finding/kernels/specializations/apply_interaction.cu.in similarity index 88% rename from device/cuda/src/finding/kernels/specializations/apply_interaction.cu.template rename to device/cuda/src/finding/kernels/specializations/apply_interaction.cu.in index 365179e1c9..026bea9321 100644 --- a/device/cuda/src/finding/kernels/specializations/apply_interaction.cu.template +++ b/device/cuda/src/finding/kernels/specializations/apply_interaction.cu.in @@ -6,7 +6,7 @@ */ // Local include(s). -#include "${SOURCE_DIR}/apply_interaction_src.cuh" +#include "src/finding/kernels/specializations/apply_interaction_src.cuh" // Project include(s). #include "traccc/geometry/detector.hpp" diff --git a/device/cuda/src/finding/kernels/specializations/find_tracks.cu.template b/device/cuda/src/finding/kernels/specializations/find_tracks.cu.in similarity index 89% rename from device/cuda/src/finding/kernels/specializations/find_tracks.cu.template rename to device/cuda/src/finding/kernels/specializations/find_tracks.cu.in index 59863bfeee..9cdf839be6 100644 --- a/device/cuda/src/finding/kernels/specializations/find_tracks.cu.template +++ b/device/cuda/src/finding/kernels/specializations/find_tracks.cu.in @@ -6,7 +6,7 @@ */ // Local include(s). -#include "${SOURCE_DIR}/find_tracks_src.cuh" +#include "src/finding/kernels/specializations/find_tracks_src.cuh" // Project include(s). #include "traccc/geometry/detector.hpp" diff --git a/device/cuda/src/finding/kernels/specializations/propagate_to_next_surface.cu.template b/device/cuda/src/finding/kernels/specializations/propagate_to_next_surface.cu.in similarity index 87% rename from device/cuda/src/finding/kernels/specializations/propagate_to_next_surface.cu.template rename to device/cuda/src/finding/kernels/specializations/propagate_to_next_surface.cu.in index 5d493e59b1..b43b336055 100644 --- a/device/cuda/src/finding/kernels/specializations/propagate_to_next_surface.cu.template +++ b/device/cuda/src/finding/kernels/specializations/propagate_to_next_surface.cu.in @@ -6,8 +6,8 @@ */ // Local include(s). -#include "${SOURCE_DIR}/../../../utils/magnetic_field_types.hpp" -#include "${SOURCE_DIR}/propagate_to_next_surface_src.cuh" +#include "src/utils/magnetic_field_types.hpp" +#include "src/finding/kernels/specializations/propagate_to_next_surface_src.cuh" // Project include(s). #include "traccc/finding/details/combinatorial_kalman_filter_types.hpp" diff --git a/device/cuda/src/fitting/kernels/specializations/fit_backward.cu.template b/device/cuda/src/fitting/kernels/specializations/fit_backward.cu.in similarity index 90% rename from device/cuda/src/fitting/kernels/specializations/fit_backward.cu.template rename to device/cuda/src/fitting/kernels/specializations/fit_backward.cu.in index 3086e91caa..4131aedd75 100644 --- a/device/cuda/src/fitting/kernels/specializations/fit_backward.cu.template +++ b/device/cuda/src/fitting/kernels/specializations/fit_backward.cu.in @@ -6,8 +6,8 @@ */ // Local include(s). -#include "${SOURCE_DIR}/../../../utils/magnetic_field_types.hpp" -#include "${SOURCE_DIR}/fit_backward_src.cuh" +#include "src/utils/magnetic_field_types.hpp" +#include "src/fitting/kernels/specializations/fit_backward_src.cuh" // Project include(s). #include "traccc/bfield/magnetic_field_types.hpp" diff --git a/device/cuda/src/fitting/kernels/specializations/fit_forward.cu.template b/device/cuda/src/fitting/kernels/specializations/fit_forward.cu.in similarity index 89% rename from device/cuda/src/fitting/kernels/specializations/fit_forward.cu.template rename to device/cuda/src/fitting/kernels/specializations/fit_forward.cu.in index 523f3e7848..bbfab56c26 100644 --- a/device/cuda/src/fitting/kernels/specializations/fit_forward.cu.template +++ b/device/cuda/src/fitting/kernels/specializations/fit_forward.cu.in @@ -6,8 +6,8 @@ */ // Local include(s). -#include "${SOURCE_DIR}/../../../utils/magnetic_field_types.hpp" -#include "${SOURCE_DIR}/fit_forward_src.cuh" +#include "src/utils/magnetic_field_types.hpp" +#include "src/fitting/kernels/specializations/fit_forward_src.cuh" // Project include(s). #include "traccc/bfield/magnetic_field_types.hpp"