Back to home page

EIC code displayed by LXR

 
 

    


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

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 // clang-format off
0011 #include "algebra/vc_soa.hpp"
0012 #include "algebra/utils/data_generator.hpp"
0013 #include "detray/benchmarks/cpu/matrix_benchmark.hpp"
0014 #include "detray/benchmarks/cpu/transform_benchmark.hpp"
0015 #include "detray/benchmarks/cpu/vector_benchmark.hpp"
0016 // clang-format on
0017 #include "detray/benchmarks/benchmark_utils.hpp"
0018 
0019 // Benchmark include
0020 #include <benchmark/benchmark.h>
0021 
0022 // System include(s)
0023 #include <iostream>
0024 
0025 using namespace detray::benchmarks;
0026 using namespace detray::algebra;
0027 
0028 /// Run vector benchmarks
0029 int main(int argc, char** argv) {
0030   constexpr std::size_t n_samples{100000};
0031 
0032   //
0033   // Prepare benchmarks
0034   //
0035   detray::benchmarks::configuration cfg_s{};
0036   // Reduce the number of samples, since a single SoA struct contains multiple
0037   // vectors
0038   cfg_s.n_samples(n_samples / Vc::float_v::Size);
0039   // Leave this to google benchmark
0040   cfg_s.do_warmup(false);
0041 
0042   // For double precision we need more samples (less vectors per SoA)
0043   detray::benchmarks::configuration cfg_d{cfg_s};
0044   cfg_d.n_samples(n_samples / Vc::double_v::Size);
0045   // Leave this to google benchmark
0046   cfg_d.do_warmup(false);
0047 
0048   using trf_f_t = transform3_bm<vc_soa::transform3<float>>;
0049   using trf_d_t = transform3_bm<vc_soa::transform3<double>>;
0050 
0051   using mat44_transp_f_t = matrix_unaryOP_bm<vc_soa::matrix_type<float, 4, 4>,
0052                                              bench_op::matrix::transpose>;
0053   using mat44_transp_d_t = matrix_unaryOP_bm<vc_soa::matrix_type<double, 4, 4>,
0054                                              bench_op::matrix::transpose>;
0055   using mat66_transp_f_t = matrix_unaryOP_bm<vc_soa::matrix_type<float, 6, 6>,
0056                                              bench_op::matrix::transpose>;
0057   using mat66_transp_d_t = matrix_unaryOP_bm<vc_soa::matrix_type<double, 6, 6>,
0058                                              bench_op::matrix::transpose>;
0059   using mat88_transp_f_t = matrix_unaryOP_bm<vc_soa::matrix_type<float, 8, 8>,
0060                                              bench_op::matrix::transpose>;
0061   using mat88_transp_d_t = matrix_unaryOP_bm<vc_soa::matrix_type<double, 8, 8>,
0062                                              bench_op::matrix::transpose>;
0063 
0064   using mat44_add_f_t = matrix_binaryOP_bm<vc_soa::matrix_type<float, 4, 4>,
0065                                            bench_op::matrix::add>;
0066   using mat44_add_d_t = matrix_binaryOP_bm<vc_soa::matrix_type<double, 4, 4>,
0067                                            bench_op::matrix::add>;
0068   using mat66_add_f_t = matrix_binaryOP_bm<vc_soa::matrix_type<float, 6, 6>,
0069                                            bench_op::matrix::add>;
0070   using mat66_add_d_t = matrix_binaryOP_bm<vc_soa::matrix_type<double, 6, 6>,
0071                                            bench_op::matrix::add>;
0072   using mat88_add_f_t = matrix_binaryOP_bm<vc_soa::matrix_type<float, 8, 8>,
0073                                            bench_op::matrix::add>;
0074   using mat88_add_d_t = matrix_binaryOP_bm<vc_soa::matrix_type<double, 8, 8>,
0075                                            bench_op::matrix::add>;
0076 
0077   using mat44_mul_f_t = matrix_binaryOP_bm<vc_soa::matrix_type<float, 4, 4>,
0078                                            bench_op::matrix::mul>;
0079   using mat44_mul_d_t = matrix_binaryOP_bm<vc_soa::matrix_type<double, 4, 4>,
0080                                            bench_op::matrix::mul>;
0081   using mat66_mul_f_t = matrix_binaryOP_bm<vc_soa::matrix_type<float, 6, 6>,
0082                                            bench_op::matrix::mul>;
0083   using mat66_mul_d_t = matrix_binaryOP_bm<vc_soa::matrix_type<double, 6, 6>,
0084                                            bench_op::matrix::mul>;
0085   using mat88_mul_f_t = matrix_binaryOP_bm<vc_soa::matrix_type<float, 8, 8>,
0086                                            bench_op::matrix::mul>;
0087   using mat88_mul_d_t = matrix_binaryOP_bm<vc_soa::matrix_type<double, 8, 8>,
0088                                            bench_op::matrix::mul>;
0089 
0090   using mat44_vec_f_t = matrix_vector_bm<vc_soa::matrix_type<float, 4, 4>,
0091                                          vc_soa::vector_type<float, 4>>;
0092   using mat44_vec_d_t = matrix_vector_bm<vc_soa::matrix_type<double, 4, 4>,
0093                                          vc_soa::vector_type<double, 4>>;
0094   using mat66_vec_f_t = matrix_vector_bm<vc_soa::matrix_type<float, 6, 6>,
0095                                          vc_soa::vector_type<float, 6>>;
0096   using mat66_vec_d_t = matrix_vector_bm<vc_soa::matrix_type<double, 6, 6>,
0097                                          vc_soa::vector_type<double, 6>>;
0098   using mat88_vec_f_t = matrix_vector_bm<vc_soa::matrix_type<float, 8, 8>,
0099                                          vc_soa::vector_type<float, 8>>;
0100   using mat88_vec_d_t = matrix_vector_bm<vc_soa::matrix_type<double, 8, 8>,
0101                                          vc_soa::vector_type<double, 8>>;
0102 
0103   std::cout << "-----------------------------------------------\n"
0104             << "Detray linear algebra benchmark (Vc SoA)\n"
0105             << "-----------------------------------------------\n\n"
0106             << "(single)\n"
0107             << cfg_s << "(double)\n"
0108             << cfg_d;
0109 
0110   //
0111   // Register all benchmarks
0112   //
0113 
0114   // Vector benchmarks
0115   DETRAY_DEFINE_VECTOR_BENCH(vc_soa)
0116   DETRAY_REGISTER_VECTOR_BENCH(cfg_s, cfg_d)
0117 
0118   // Transform benchmarks
0119   detray::benchmarks::register_benchmark<trf_f_t>(cfg_s, "_SINGLE");
0120   detray::benchmarks::register_benchmark<trf_d_t>(cfg_d, "_DOUBLE");
0121 
0122   // Matrix benchmarks
0123   detray::benchmarks::register_benchmark<mat44_transp_f_t>(cfg_s,
0124                                                            "_4x4_SINGLE");
0125   detray::benchmarks::register_benchmark<mat44_transp_d_t>(cfg_d,
0126                                                            "_4x4_DOUBLE");
0127   detray::benchmarks::register_benchmark<mat66_transp_f_t>(cfg_s,
0128                                                            "_6x6_SINGLE");
0129   detray::benchmarks::register_benchmark<mat66_transp_d_t>(cfg_d,
0130                                                            "_6x6_DOUBLE");
0131   detray::benchmarks::register_benchmark<mat88_transp_f_t>(cfg_s,
0132                                                            "_8x8_SINGLE");
0133   detray::benchmarks::register_benchmark<mat88_transp_d_t>(cfg_d,
0134                                                            "_8x8_DOUBLE");
0135 
0136   detray::benchmarks::register_benchmark<mat44_add_f_t>(cfg_s, "_4x4_SINGLE");
0137   detray::benchmarks::register_benchmark<mat44_add_d_t>(cfg_d, "_4x4_DOUBLE");
0138   detray::benchmarks::register_benchmark<mat66_add_f_t>(cfg_s, "_6x6_SINGLE");
0139   detray::benchmarks::register_benchmark<mat66_add_d_t>(cfg_d, "_6x6_DOUBLE");
0140   detray::benchmarks::register_benchmark<mat88_add_f_t>(cfg_s, "_8x8_SINGLE");
0141   detray::benchmarks::register_benchmark<mat88_add_d_t>(cfg_d, "_8x8_DOUBLE");
0142 
0143   detray::benchmarks::register_benchmark<mat44_mul_f_t>(cfg_s, "_4x4_SINGLE");
0144   detray::benchmarks::register_benchmark<mat44_mul_d_t>(cfg_d, "_4x4_DOUBLE");
0145   detray::benchmarks::register_benchmark<mat66_mul_f_t>(cfg_s, "_6x6_SINGLE");
0146   detray::benchmarks::register_benchmark<mat66_mul_d_t>(cfg_d, "_6x6_DOUBLE");
0147   detray::benchmarks::register_benchmark<mat88_mul_f_t>(cfg_s, "_8x8_SINGLE");
0148   detray::benchmarks::register_benchmark<mat88_mul_d_t>(cfg_d, "_8x8_DOUBLE");
0149 
0150   detray::benchmarks::register_benchmark<mat44_vec_f_t>(cfg_s, "_4x4_SINGLE");
0151   detray::benchmarks::register_benchmark<mat44_vec_d_t>(cfg_d, "_4x4_DOUBLE");
0152   detray::benchmarks::register_benchmark<mat66_vec_f_t>(cfg_s, "_6x6_SINGLE");
0153   detray::benchmarks::register_benchmark<mat66_vec_d_t>(cfg_d, "_6x6_DOUBLE");
0154   detray::benchmarks::register_benchmark<mat88_vec_f_t>(cfg_s, "_8x8_SINGLE");
0155   detray::benchmarks::register_benchmark<mat88_vec_d_t>(cfg_d, "_8x8_DOUBLE");
0156 
0157   ::benchmark::Initialize(&argc, argv);
0158   ::benchmark::RunSpecifiedBenchmarks();
0159   ::benchmark::Shutdown();
0160 }