Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-27 07:24:26

0001 // This file is part of the ACTS project.
0002 //
0003 // Copyright (C) 2016 CERN for the benefit of the ACTS project
0004 //
0005 // This Source Code Form is subject to the terms of the Mozilla Public
0006 // License, v. 2.0. If a copy of the MPL was not distributed with this
0007 // file, You can obtain one at https://mozilla.org/MPL/2.0/.
0008 
0009 // Project include(s)
0010 #include "detector_construction.hpp"
0011 
0012 #include "detray/core/detail/alignment.hpp"
0013 #include "detray/test/common/build_toy_detector.hpp"
0014 #include "detray/utils/logging.hpp"
0015 
0016 // Vecmem include(s)
0017 #include <vecmem/memory/cuda/device_memory_resource.hpp>
0018 #include <vecmem/memory/cuda/managed_memory_resource.hpp>
0019 #include <vecmem/memory/host_memory_resource.hpp>
0020 #include <vecmem/utils/cuda/async_copy.hpp>
0021 #include <vecmem/utils/cuda/copy.hpp>
0022 
0023 // System include(s)
0024 #include <iostream>
0025 
0026 /// Prepare the data and move it to device
0027 int main() {
0028   using algebra_t = detray::tutorial::algebra_t;
0029   using scalar = detray::tutorial::scalar;
0030 
0031   // memory resource(s)
0032   vecmem::host_memory_resource host_mr;
0033   vecmem::cuda::managed_memory_resource mng_mr;
0034   vecmem::cuda::device_memory_resource dev_mr;
0035 
0036   // Helper object for performing memory copies to CUDA devices
0037   vecmem::cuda::copy cuda_cpy;
0038 
0039   std::clog << "Detector Device Construction "
0040                "Tutorial\n=====================================\n\n";
0041 
0042   //
0043   // Managed Memory
0044   //
0045 
0046   // create toy geometry with vecmem managed memory resource
0047   auto [det_mng, names_mng] = detray::build_toy_detector<algebra_t>(mng_mr);
0048 
0049   // Get the view onto the detector data directly
0050   auto det_mng_data = detray::get_data(det_mng);
0051 
0052   // Pass the view and call the kernel
0053   DETRAY_INFO_HOST("Using CUDA unified memory:");
0054   detray::tutorial::print(det_mng_data);
0055 
0056   //
0057   // Default copy to device
0058   //
0059 
0060   // create toy geometry in host memory
0061   auto [det_host, names_host] = detray::build_toy_detector<algebra_t>(host_mr);
0062 
0063   // Copy the detector data to device (synchronous copy, fixed size buffers)
0064   auto det_fixed_buff = detray::get_buffer(det_host, dev_mr, cuda_cpy);
0065 
0066   // Get the detector view from the buffer and call the kernel
0067   DETRAY_INFO_HOST("Synchronous copy, fixed size buffers:");
0068   detray::tutorial::print(detray::get_data(det_fixed_buff));
0069 
0070   // Copy the data to device in resizable buffers (synchronous copy)
0071   auto det_resz_buff =
0072       detray::get_buffer(det_host, dev_mr, cuda_cpy, detray::copy::sync,
0073                          vecmem::data::buffer_type::resizable);
0074 
0075   DETRAY_INFO_HOST("Synchronous copy, resizable buffers:");
0076   detray::tutorial::print(detray::get_data(det_resz_buff));
0077 
0078   //
0079   // Custom copy to device
0080   //
0081 
0082   // Get each buffer individually
0083   auto vol_buff = detray::get_buffer(det_host.volumes(), dev_mr, cuda_cpy,
0084                                      detray::copy::sync,
0085                                      vecmem::data::buffer_type::fixed_size);
0086   auto sf_buff = detray::get_buffer(det_host.surfaces(), dev_mr, cuda_cpy,
0087                                     detray::copy::sync,
0088                                     vecmem::data::buffer_type::fixed_size);
0089   auto trf_buff = detray::get_buffer(det_host.transform_store(), dev_mr,
0090                                      cuda_cpy, detray::copy::sync,
0091                                      vecmem::data::buffer_type::fixed_size);
0092   auto msk_buff = detray::get_buffer(det_host.mask_store(), dev_mr, cuda_cpy,
0093                                      detray::copy::sync,
0094                                      vecmem::data::buffer_type::fixed_size);
0095   auto mat_buff = detray::get_buffer(det_host.material_store(), dev_mr,
0096                                      cuda_cpy, detray::copy::sync,
0097                                      vecmem::data::buffer_type::fixed_size);
0098   auto acc_buff = detray::get_buffer(det_host.accelerator_store(), dev_mr,
0099                                      cuda_cpy, detray::copy::sync,
0100                                      vecmem::data::buffer_type::fixed_size);
0101 
0102   // Assemble the detector buffer
0103   using host_detector_type = decltype(det_host);
0104   auto det_custom_buff = typename host_detector_type::buffer_type(
0105       std::move(vol_buff), std::move(sf_buff), std::move(trf_buff),
0106       std::move(msk_buff), std::move(mat_buff), std::move(acc_buff));
0107 
0108   DETRAY_INFO_HOST("Custom buffer setup:");
0109   detray::tutorial::print(detray::get_data(det_custom_buff));
0110 
0111   // Construct an "aligned" transform store
0112   using host_transform_type =
0113       host_detector_type::transform_container::value_type;
0114 
0115   typename host_detector_type::transform_container host_aligned_transforms;
0116   detray::tutorial::point3 shift{.1f * detray::unit<scalar>::mm,
0117                                  .2f * detray::unit<scalar>::mm,
0118                                  .3f * detray::unit<scalar>::mm};
0119 
0120   for (const auto& tf : det_host.transform_store()) {
0121     detray::tutorial::point3 shifted{tf.translation()[0] + shift[0],
0122                                      tf.translation()[1] + shift[1],
0123                                      tf.translation()[2] + shift[2]};
0124     host_aligned_transforms.push_back(
0125         host_transform_type{shifted, tf.x(), tf.y(), tf.z()});
0126   }
0127 
0128   auto trf_buff_shifted = detray::get_buffer(
0129       host_aligned_transforms, dev_mr, cuda_cpy, detray::copy::sync,
0130       vecmem::data::buffer_type::fixed_size);
0131 
0132   auto detector_view =
0133       detray::detail::misaligned_detector_view<host_detector_type>(
0134           det_custom_buff, trf_buff_shifted);
0135 
0136   DETRAY_INFO_HOST("Custom buffer setup (shifted):");
0137   detray::tutorial::print(detector_view);
0138 }