diff --git a/algo/CMakeLists.txt b/algo/CMakeLists.txt index 965746fe0dcc75f65531937065f46f797279e07b..64e9ffc5c877ee8e29239266a983cea22366d2a5 100644 --- a/algo/CMakeLists.txt +++ b/algo/CMakeLists.txt @@ -1,8 +1,7 @@ -add_subdirectory (data) -add_subdirectory (test) +add_subdirectory(data) +add_subdirectory(test) # Create a library libCbmAlgo - set(SRCS evbuild/EventBuilder.cxx trigger/TimeClusterTrigger.cxx @@ -10,7 +9,7 @@ set(SRCS detectors/sts/UnpackSts.cxx detectors/much/MuchReadoutConfig.cxx detectors/much/UnpackMuch.cxx - ) +) add_library(Algo SHARED ${SRCS}) @@ -37,3 +36,9 @@ target_link_libraries(Algo OnlineData) target_compile_definitions(Algo PUBLIC NO_ROOT) install(TARGETS Algo DESTINATION lib) + +install(FILES ca/simd/CaSimd.h + ca/simd/CaSimdVc.h + ca/simd/CaSimdPseudo.h + DESTINATION include/ca/simd +) diff --git a/reco/L1/vectors/L1vec.h b/algo/ca/simd/CaSimd.h similarity index 65% rename from reco/L1/vectors/L1vec.h rename to algo/ca/simd/CaSimd.h index 901ab2f7fa3ac4f86346bebd928622095e6af2ca..5c42832e7bf51bffe9a3e4432e77f88a834101c5 100644 --- a/reco/L1/vectors/L1vec.h +++ b/algo/ca/simd/CaSimd.h @@ -2,10 +2,10 @@ SPDX-License-Identifier: GPL-3.0-only Authors: Sergey Gorbunov [committer]*/ -#ifndef L1vec_H -#define L1vec_H +#ifndef Ca_CaSimd_H +#define Ca_CaSimd_H -#include "vectors/L1vecVc.h" -//#include "vectors/L1vecPseudo.h" +#include "ca/simd/CaSimdVc.h" +//#include "ca/simd/CaSimdPseudo.h" #endif diff --git a/algo/ca/simd/CaSimdPseudo.h b/algo/ca/simd/CaSimdPseudo.h new file mode 100644 index 0000000000000000000000000000000000000000..3e876001ee8b65863c58ee546644c5a0a44c6330 --- /dev/null +++ b/algo/ca/simd/CaSimdPseudo.h @@ -0,0 +1,271 @@ +/* Copyright (C) 2010 Frankfurt Institute for Advanced Studies, Goethe-Universität Frankfurt, Frankfurt + SPDX-License-Identifier: GPL-3.0-only + Authors: Igor Kulakov [committer] */ + +#ifndef Ca_CaSimdPseudo_H +#define Ca_CaSimdPseudo_H + +#include <iomanip> +#include <iostream> + +#include <cmath> + +namespace cbm::algo::ca +{ + + typedef float fscal; + + /********************************** + * + * Pseudo SIMD vector + * + **********************************/ + + fscal min(fscal x, fscal y); + fscal max(fscal x, fscal y); + fscal asgnb(fscal x, fscal y); + fscal sgn(fscal x); + + + class fmask { + + public: + static constexpr int Size {4}; + + static constexpr size_t size() { return Size; } + + bool v[Size]; + + bool& operator[](size_t i) { return v[i]; } + bool operator[](size_t i) const { return v[i]; } + + fmask() : fmask(0.f) {} + + fmask(const fmask& a) + { + for (size_t i = 0; i < size(); i++) { + v[i] = a.v[i]; + } + } + + fmask(bool a) + { + for (size_t i = 0; i < size(); i++) { + v[i] = a; + } + } + + static fmask One() { return fmask(true); } + + static fmask Zero() { return fmask(false); } + +#define _op(A, B, F) \ + fmask z; \ + for (size_t i = 0; i < size(); i++) { \ + z[i] = (A[i] F B[i]); \ + } \ + return z; + + /* Logic */ + friend fmask operator&&(const fmask& a, const fmask& b) { _op(a, b, &&) } + friend fmask operator||(const fmask& a, const fmask& b) { _op(a, b, ||) } + friend fmask operator&(const fmask& a, const fmask& b) { _op(a, b, &) } + friend fmask operator|(const fmask& a, const fmask& b) { _op(a, b, |) } + friend fmask operator^(const fmask& a, const fmask& b) { _op(a, b, ^) } + +#undef _op + + friend fmask operator!(const fmask& a) + { + fmask z; + for (size_t i = 0; i < size(); i++) { + z[i] = !a[i]; + } + return z; + } + + bool isEmpty() + { + bool ret = true; + for (size_t i = 0; i < size(); i++) { + ret = ret && (!v[i]); + } + return ret; + } + + bool isNotEmpty() { return !isEmpty(); } + + + friend std::ostream& operator<<(std::ostream& strm, const fmask& a) + { + strm << '['; + for (size_t i = 0; i < size(); i++) { + strm << std::setw(12) << std::setfill(' ') << a[i] << ' '; + } + return strm; + } + + friend std::istream& operator>>(std::istream& strm, fmask& a) + { + for (size_t i = 0; i < size(); i++) { + strm >> a[i]; + } + return strm; + } + }; + + + class fvec { + + public: + static constexpr size_t size() { return fmask::size(); } + + fscal v[fmask::Size]; + + fvec() : fvec(0.) {} + + fvec(const fvec& a) + { + for (size_t i = 0; i < size(); i++) { + v[i] = a.v[i]; + } + } + + fvec(fscal a) + { + for (size_t i = 0; i < size(); i++) { + v[i] = a; + } + } + + static fvec One() { return fvec(1.); } + + static fvec Zero() { return fvec(0.); } + + fscal& operator[](size_t i) { return v[i]; } + + fscal operator[](size_t i) const { return v[i]; } + + void setZero(fmask m) + { + for (size_t i = 0; i < size(); i++) { + if (m[i]) { v[i] = 0.; } + } + } + +#define _f1(A, F) \ + fvec z; \ + for (size_t i = 0; i < size(); i++) { \ + z[i] = F(A[i]); \ + } \ + return z; + +#define _f2(A, B, F) \ + fvec z; \ + for (size_t i = 0; i < size(); i++) { \ + z[i] = F(A[i], B[i]); \ + } \ + return z; + +#define _op(A, B, F) \ + fvec z; \ + for (size_t i = 0; i < size(); i++) { \ + z[i] = (A[i] F B[i]); \ + } \ + return z; + +#define _opComp(A, B, F) \ + fmask z; \ + for (size_t i = 0; i < size(); i++) { \ + z[i] = (A[i] F B[i]); \ + } \ + return z; + + + /* Arithmetic Operators */ + friend fvec operator+(const fvec& a, const fvec& b) { _op(a, b, +) } + friend fvec operator-(const fvec& a, const fvec& b) { _op(a, b, -) } + friend fvec operator*(const fvec& a, const fvec& b) { _op(a, b, *) } + friend fvec operator/(const fvec& a, const fvec& b) { _op(a, b, /) } + + /* Comparison */ + friend fmask operator<(const fvec& a, const fvec& b) { _opComp(a, b, <) } + friend fmask operator<=(const fvec& a, const fvec& b) { _opComp(a, b, <=) } + friend fmask operator>(const fvec& a, const fvec& b) { _opComp(a, b, >) } + friend fmask operator>=(const fvec& a, const fvec& b) { _opComp(a, b, >=) } + friend fmask operator==(const fvec& a, const fvec& b) { _opComp(a, b, ==) } + + friend fmask isnan(const fvec& a) + { + fmask m; + for (size_t i = 0; i < size(); i++) { + m[i] = std::isnan(a[i]); + } + return m; + } + + friend fvec iif(fmask a, fvec b, fvec c) + { + fvec z; + for (size_t i = 0; i < size(); i++) { + z[i] = a[i] ? b[i] : c[i]; + } + return z; + } + + /* Functions */ + friend fscal min(fscal x, fscal y) { return x < y ? x : y; } + friend fscal max(fscal x, fscal y) { return x < y ? y : x; } + friend fscal asgnb(fscal x, fscal y) { return y >= 0.f ? fabs(x) : -fabs(x); } + friend fscal sgn(fscal x) { return x >= 0.f ? 1.f : -1.f; } + + friend fvec min(const fvec& a, const fvec& b) { _f2(a, b, min) } + friend fvec max(const fvec& a, const fvec& b) { _f2(a, b, max) } + friend fvec asgnb(const fvec& a, const fvec& b) { _f2(a, b, asgnb) } + friend fvec sqrt(const fvec& a) { _f1(a, sqrt) } + friend fvec abs(const fvec& a) { _f1(a, fabs) } + friend fvec sgn(const fvec& a) { _f1(a, sgn) } + friend fvec exp(const fvec& a) { _f1(a, exp) } + friend fvec log(const fvec& a) { _f1(a, log) } + friend fvec sin(const fvec& a) { _f1(a, sin) } + friend fvec cos(const fvec& a) { _f1(a, cos) } +#undef _f1 +#undef _f2 +#undef _op +#undef _opComp + + /* Define all operators for consistensy */ + + friend fvec operator-(const fvec& a) { return fvec(0) - a; } + friend fvec operator+(const fvec& a) { return a; } + + friend void operator+=(fvec& a, const fvec& b) { a = a + b; } + friend void operator-=(fvec& a, const fvec& b) { a = a - b; } + friend void operator*=(fvec& a, const fvec& b) { a = a * b; } + friend void operator/=(fvec& a, const fvec& b) { a = a / b; } + + friend std::ostream& operator<<(std::ostream& strm, const fvec& a) + { + //strm << "[" << a[0] << " " << a[1] << " " << a[2] << " " << a[3] << "]"; + strm << '['; + for (size_t i = 0; i < size(); i++) { + strm << std::setw(12) << std::setfill(' ') << a[i] << ' '; + } + return strm; + } + + friend std::istream& operator>>(std::istream& strm, fvec& a) + { + for (size_t i = 0; i < size(); i++) { + strm >> a[i]; + } + return strm; + } + + } __attribute__((aligned(16))); + +#define _fvecalignment __attribute__((aligned(fvec::size() * sizeof(fscal)))) + +} // namespace cbm::algo::ca + +#endif diff --git a/reco/L1/vectors/L1vecVc.h b/algo/ca/simd/CaSimdVc.h similarity index 61% rename from reco/L1/vectors/L1vecVc.h rename to algo/ca/simd/CaSimdVc.h index 639a221624dfcf4bec35db0c8a461effc376a87d..8eebae3401de13eaff753126eed94efec87eb270 100644 --- a/reco/L1/vectors/L1vecVc.h +++ b/algo/ca/simd/CaSimdVc.h @@ -2,15 +2,20 @@ SPDX-License-Identifier: GPL-3.0-only Authors: Igor Kulakov [committer], Maksym Zyzak */ -#ifndef L1vecVc_H -#define L1vecVc_H +#ifndef Ca_CaSimdVc_H +#define Ca_CaSimdVc_H #include "Vc/Vc" -typedef Vc::float_v fvec; -typedef fvec::EntryType fscal; -typedef Vc::float_m fmask; +namespace cbm::algo::ca +{ + + typedef Vc::float_v fvec; + typedef fvec::EntryType fscal; + typedef Vc::float_m fmask; #define _fvecalignment __attribute__((aligned(Vc::VectorAlignment))) +} // namespace cbm::algo::ca + #endif diff --git a/analysis/PWGCHA/jpsi/CMakeLists.txt b/analysis/PWGCHA/jpsi/CMakeLists.txt index f60e7e1fbeffd2ae0880b7f6c84ab70c045ced54..832b91e37d4b05931968df39a6dcd5c79574b9c4 100644 --- a/analysis/PWGCHA/jpsi/CMakeLists.txt +++ b/analysis/PWGCHA/jpsi/CMakeLists.txt @@ -13,6 +13,7 @@ ${CBMDATA_DIR}/rich ${CBMDATA_DIR}/trd ${CBMDATA_DIR}/tof +${CBMROOT_SOURCE_DIR}/algo ${CBMROOT_SOURCE_DIR}/reco/KF ${CBMROOT_SOURCE_DIR}/reco/KF/Interface @@ -70,7 +71,7 @@ ADD_DEFINITIONS(-DDO_TPCCATRACKER_EFF_PERFORMANCE -DNonhomogeneousField -DCBM -D Set(LINKDEF CbmJPsiAnalysisLinkDef.h) Set(LIBRARY_NAME CbmJPsiAnalysis) -Set(DEPENDENCIES KF L1 CbmRichReco CbmRichBase CbmBase CbmData Littrack) +Set(DEPENDENCIES Algo KF L1 CbmRichReco CbmRichBase CbmBase CbmData Littrack) Set(DEFINITIONS -DDO_TPCCATRACKER_EFF_PERFORMANCE -DNonhomogeneousField -DCBM -DUSE_TIMERS) GENERATE_LIBRARY() diff --git a/analysis/PWGDIL/dielectron/conversion/CMakeLists.txt b/analysis/PWGDIL/dielectron/conversion/CMakeLists.txt index 17355aa06ccfee593233d226a13c8fcdb190a16c..7e0f93cb243aeffa36e768131526114dcd2fb446 100644 --- a/analysis/PWGDIL/dielectron/conversion/CMakeLists.txt +++ b/analysis/PWGDIL/dielectron/conversion/CMakeLists.txt @@ -13,6 +13,8 @@ ${CBMDATA_DIR}/rich ${CBMROOT_SOURCE_DIR}/core/detectors/rich/utils ${CBMROOT_SOURCE_DIR}/core/detectors/rich +${CBMROOT_SOURCE_DIR}/algo + ${CBMROOT_SOURCE_DIR}/reco/base ${CBMROOT_SOURCE_DIR}/reco/KF @@ -75,7 +77,7 @@ ADD_DEFINITIONS(-DDO_TPCCATRACKER_EFF_PERFORMANCE -DNonhomogeneousField -DCBM -D Set(LINKDEF CbmConversionAnalysisLinkDef.h) Set(LIBRARY_NAME CbmConversionAnalysis) -Set(DEPENDENCIES KF L1 CbmRichReco CbmRichBase CbmRecoBase CbmData Littrack) +Set(DEPENDENCIES Algo KF L1 CbmRichReco CbmRichBase CbmRecoBase CbmData Littrack) Set(DEFINITIONS -DDO_TPCCATRACKER_EFF_PERFORMANCE -DNonhomogeneousField -DCBM -DUSE_TIMERS) GENERATE_LIBRARY() diff --git a/analysis/PWGDIL/dielectron/lmvm/CMakeLists.txt b/analysis/PWGDIL/dielectron/lmvm/CMakeLists.txt index 838d44393d9aba0303ff2b4c0be6c0f797052954..7df5fd17692c63cfdff2466fdd3060e9b336ec68 100644 --- a/analysis/PWGDIL/dielectron/lmvm/CMakeLists.txt +++ b/analysis/PWGDIL/dielectron/lmvm/CMakeLists.txt @@ -16,6 +16,8 @@ ${CBMDATA_DIR}/rich ${CBMDATA_DIR}/trd ${CBMDATA_DIR}/tof +${CBMROOT_SOURCE_DIR}/algo + ${CBMROOT_SOURCE_DIR}/reco/KF ${CBMROOT_SOURCE_DIR}/reco/KF/Interface @@ -72,7 +74,7 @@ ADD_DEFINITIONS(-DDO_TPCCATRACKER_EFF_PERFORMANCE -DNonhomogeneousField -DCBM -D Set(LINKDEF LmvmLinkDef.h) Set(LIBRARY_NAME CbmLmvm) Set(DEPENDENCIES - Littrack LittrackQA KF L1 CbmRichBase CbmRichReco CbmRecoBase CbmBase CbmData) + Littrack LittrackQA Algo KF L1 CbmRichBase CbmRichReco CbmRecoBase CbmBase CbmData) Set(DEFINITIONS -DDO_TPCCATRACKER_EFF_PERFORMANCE -DNonhomogeneousField -DCBM -DUSE_TIMERS) GENERATE_LIBRARY() diff --git a/analysis/PWGDIL/dielectron/papaframework/CMakeLists.txt b/analysis/PWGDIL/dielectron/papaframework/CMakeLists.txt index 2057253628c81177713802b6e8d1b8edd5ec15f5..2c341fb5467e0c561f50d45bdff60e8368aafc82 100644 --- a/analysis/PWGDIL/dielectron/papaframework/CMakeLists.txt +++ b/analysis/PWGDIL/dielectron/papaframework/CMakeLists.txt @@ -21,6 +21,8 @@ ${CBMROOT_SOURCE_DIR}/core/detectors/rich ${CBMROOT_SOURCE_DIR}/sim/transport/generators/unigen +${CBMROOT_SOURCE_DIR}/algo + ${CBMROOT_SOURCE_DIR}/reco/KF ${CBMROOT_SOURCE_DIR}/reco/KF/Interface ${KFParticle_INCLUDE_DIR} @@ -136,7 +138,7 @@ EndIf() Set(LINKDEF CbmPapaLinkDef.h) Set(LIBRARY_NAME CbmPapa) Set(DEPENDENCIES - L1 KF Littrack CbmRichReco CbmRichBase CbmBase CbmData CbmSimGenerators Base) + Algo L1 KF Littrack CbmRichReco CbmRichBase CbmBase CbmData CbmSimGenerators Base) GENERATE_LIBRARY() diff --git a/analysis/PWGDIL/dielectron/pi0eta/CMakeLists.txt b/analysis/PWGDIL/dielectron/pi0eta/CMakeLists.txt index 48fcb315e485898c4dbc2592a9e8eb790122bfd4..0698d24517071e5f159d0c17c0e53147c81016e3 100644 --- a/analysis/PWGDIL/dielectron/pi0eta/CMakeLists.txt +++ b/analysis/PWGDIL/dielectron/pi0eta/CMakeLists.txt @@ -10,6 +10,8 @@ ${CBMDATA_DIR}/sts ${CBMDATA_DIR}/global ${CBMDATA_DIR}/rich +${CBMROOT_SOURCE_DIR}/algo + ${CBMROOT_SOURCE_DIR}/reco/base ${CBMROOT_SOURCE_DIR}/reco/KF @@ -88,7 +90,7 @@ ADD_DEFINITIONS(-DDO_TPCCATRACKER_EFF_PERFORMANCE -DNonhomogeneousField -DCBM -D Set(LINKDEF CbmConversion2AnalysisLinkDef.h) Set(LIBRARY_NAME CbmConversion2Analysis) -Set(DEPENDENCIES KF L1 CbmRichBase CbmRichReco CbmRecoBase CbmData) +Set(DEPENDENCIES Algo KF L1 CbmRichBase CbmRichReco CbmRecoBase CbmData) Set(DEFINITIONS -DDO_TPCCATRACKER_EFF_PERFORMANCE -DNonhomogeneousField -DCBM -DUSE_TIMERS) GENERATE_LIBRARY() diff --git a/analysis/common/analysis_tree_converter/CMakeLists.txt b/analysis/common/analysis_tree_converter/CMakeLists.txt index 6b4ab3bf7048d997b6a5e9656bc5d4907af25446..8824520699f0ac79fa42d2e6141dde5f84e1a3b8 100644 --- a/analysis/common/analysis_tree_converter/CMakeLists.txt +++ b/analysis/common/analysis_tree_converter/CMakeLists.txt @@ -18,6 +18,8 @@ set(SRCS Set(INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR} + ${CBMROOT_SOURCE_DIR}/algo + ${CBMROOT_SOURCE_DIR}/core/base ${CBMROOT_SOURCE_DIR}/core/data ${CBMROOT_SOURCE_DIR}/core/data/base @@ -74,7 +76,8 @@ Set(LINKDEF CbmAnalysisTreeInterfaceLinkDef.h) Set(_AnalysisTree_LIB AnalysisTreeBase AnalysisTreeInfra) Set(DEPENDENCIES - ${_AnalysisTree_LIB} + ${_AnalysisTree_LIB} + Algo CbmData CbmBase KFParticleInterface diff --git a/reco/KF/KF.cmake b/reco/KF/KF.cmake index 5307a31576137af26c90c6aa7b1f3cf965d110cf..eba984a86d420846515281f27ab49d646593b9ff 100644 --- a/reco/KF/KF.cmake +++ b/reco/KF/KF.cmake @@ -5,6 +5,7 @@ Set(INCLUDE_DIRECTORIES ${CBMBASE_DIR} +${CBMROOT_SOURCE_DIR}/algo ${CBMROOT_SOURCE_DIR}/reco/base ${CBMDATA_DIR} @@ -39,14 +40,13 @@ ${CBMROOT_SOURCE_DIR}/sim/transport/geosetup # TMP for tracker interface Include_Directories( ${INCLUDE_DIRECTORIES}) Set(SYSTEM_INCLUDE_DIRECTORIES - ${VC_INCLUDE_DIRS} ${BASE_INCLUDE_DIRECTORIES} ) Include_Directories(SYSTEM ${SYSTEM_INCLUDE_DIRECTORIES}) set(LINK_DIRECTORIES -${Vc_LIB_DIR} +${Algo_LIB_DIR} ${FAIRROOT_LIBRARY_DIR} ${ROOT_LIBRARY_DIR} ${Boost_LIBRARY_DIRS} @@ -175,7 +175,7 @@ ENDIF (SSE_FOUND) set(LINKDEF KFLinkDef.h) Set(LIBRARY_NAME KF) Set(DEPENDENCIES - CbmRecoBase CbmSimSteer CbmStsBase CbmMvd CbmMuchBase CbmTrdBase CbmTofBase CbmBase CbmData Base Vc.a Minuit2 + Algo CbmRecoBase CbmSimSteer CbmStsBase CbmMvd CbmMuchBase CbmTrdBase CbmTofBase CbmBase CbmData Base Minuit2 ) Set(DEFINITIONS -DDO_TPCCATRACKER_EFF_PERFORMANCE -DNonhomogeneousField -DCBM -DUSE_TIMERS) diff --git a/reco/KF/KFParticleInterface.cmake b/reco/KF/KFParticleInterface.cmake index 7fb7e1d11a6678e0ddf3c5601e04491964442ea6..60fd28d75975d42d8d84bc28af074eed1a77214b 100644 --- a/reco/KF/KFParticleInterface.cmake +++ b/reco/KF/KFParticleInterface.cmake @@ -3,106 +3,113 @@ # The extension is already found. Any number of sources could be listed here. Set(INCLUDE_DIRECTORIES -${CBMBASE_DIR} + ${CBMBASE_DIR} -${CBMROOT_SOURCE_DIR}/reco/base + ${CBMROOT_SOURCE_DIR}/algo + ${CBMROOT_SOURCE_DIR}/reco/base -${CBMDATA_DIR} -${CBMDATA_DIR}/base -${CBMDATA_DIR}/sts -${CBMDATA_DIR}/mvd -${CBMDATA_DIR}/much -${CBMDATA_DIR}/trd -${CBMDATA_DIR}/rich -${CBMDATA_DIR}/tof -${CBMDATA_DIR}/global + ${CBMDATA_DIR} + ${CBMDATA_DIR}/base + ${CBMDATA_DIR}/sts + ${CBMDATA_DIR}/mvd + ${CBMDATA_DIR}/much + ${CBMDATA_DIR}/trd + ${CBMDATA_DIR}/rich + ${CBMDATA_DIR}/tof + ${CBMDATA_DIR}/global -${CBMROOT_SOURCE_DIR}/reco/KF -${CBMROOT_SOURCE_DIR}/reco/KF/Interface -${CBMROOT_SOURCE_DIR}/reco/KF/KFQA + ${CBMROOT_SOURCE_DIR}/reco/KF + ${CBMROOT_SOURCE_DIR}/reco/KF/Interface + ${CBMROOT_SOURCE_DIR}/reco/KF/KFQA -${CBMDETECTORBASE_DIR}/sts + ${CBMDETECTORBASE_DIR}/sts -${CBMROOT_SOURCE_DIR}/reco/L1 -${CBMROOT_SOURCE_DIR}/reco/L1/L1Algo -#${CBMROOT_SOURCE_DIR}/reco/L1/ParticleFinder + ${CBMROOT_SOURCE_DIR}/reco/L1 + ${CBMROOT_SOURCE_DIR}/reco/L1/L1Algo -${CBMROOT_SOURCE_DIR}/mvd + # ${CBMROOT_SOURCE_DIR}/reco/L1/ParticleFinder + ${CBMROOT_SOURCE_DIR}/mvd ) -Include_Directories( ${INCLUDE_DIRECTORIES}) +Include_Directories(${INCLUDE_DIRECTORIES}) Set(SYSTEM_INCLUDE_DIRECTORIES -# ${KFParticle_INCLUDE_DIR} - ${VC_INCLUDE_DIRS} - ${BASE_INCLUDE_DIRECTORIES} + # ${KFParticle_INCLUDE_DIR} + ${BASE_INCLUDE_DIRECTORIES} ) Include_Directories(SYSTEM ${SYSTEM_INCLUDE_DIRECTORIES}) set(LINK_DIRECTORIES -${Vc_LIB_DIR} -#${KFParticle_LIB_DIR} -${FAIRROOT_LIBRARY_DIR} -${ROOT_LIBRARY_DIR} -${Boost_LIBRARY_DIRS} + ${Algo_LIB_DIR} + # ${KFParticle_LIB_DIR} + ${FAIRROOT_LIBRARY_DIR} + ${ROOT_LIBRARY_DIR} + ${Boost_LIBRARY_DIRS} ) - + link_directories(BEFORE ${LINK_DIRECTORIES}) set(SRCS -CbmKFParticleFinder.cxx -CbmKFParticleFinderPID.cxx -CbmKFParticleFinderQa.cxx -CbmKFParticleInterface.cxx + CbmKFParticleFinder.cxx + CbmKFParticleFinderPID.cxx + CbmKFParticleFinderQa.cxx + CbmKFParticleInterface.cxx ) - set(HEADERS -CbmKFParticleFinder.h -CbmKFParticleFinderPID.h -CbmKFParticleFinderQa.h -CbmKFParticleInterface.h + CbmKFParticleFinder.h + CbmKFParticleFinderPID.h + CbmKFParticleFinderQa.h + CbmKFParticleInterface.h ) If(CMAKE_CXX_COMPILER_ID MATCHES "Clang") ADD_DEFINITIONS(-Wall -Wsign-promo -Wctor-dtor-privacy -Wreorder -Wno-deprecated -Wno-parentheses -DDO_TPCCATRACKER_EFF_PERFORMANCE -DNonhomogeneousField -DCBM -DUSE_TIMERS) # -Weffc++ -Wnon-virtual-dtor -Woverloaded-virtual -Wold-style-cast : wait for other parts of cbmroot\root. - #---Check for compiler flags + + # ---Check for compiler flags CHECK_CXX_COMPILER_FLAG("-Werror -Wno-pmf-conversions" HAS_PMF) + If(HAS_PMF) ADD_DEFINITIONS(-Wno-pmf-conversions) EndIf() + CHECK_CXX_COMPILER_FLAG("-Werror -Wstrict-null-sentinel" HAS_SENTINEL) + If(HAS_SENTINEL) ADD_DEFINITIONS(-Wstrict-null-sentinel) EndIf() + CHECK_CXX_COMPILER_FLAG("-Werror -Wno-non-template-friend" HAS_TEMPLATE_FRIEND) + If(HAS_TEMPLATE_FRIEND) ADD_DEFINITIONS(-Wno-non-template-friend) EndIf() + CHECK_CXX_COMPILER_FLAG("-Werror -Wno-pragmas" HAS_PRAGMA) + If(HAS_PRAGMA) ADD_DEFINITIONS(-Wno-pragmas) EndIf() Else() - ADD_DEFINITIONS(-Wall -Wsign-promo -Wno-pmf-conversions -Wctor-dtor-privacy -Wreorder -Wno-deprecated -Wstrict-null-sentinel -Wno-non-template-friend -Wno-pragmas -Wno-parentheses -DDO_TPCCATRACKER_EFF_PERFORMANCE -DNonhomogeneousField -DCBM -DUSE_TIMERS) # -Weffc++ -Wnon-virtual-dtor -Woverloaded-virtual -Wold-style-cast : wait for other parts of cbmroot\root. + ADD_DEFINITIONS(-Wall -Wsign-promo -Wno-pmf-conversions -Wctor-dtor-privacy -Wreorder -Wno-deprecated -Wstrict-null-sentinel -Wno-non-template-friend -Wno-pragmas -Wno-parentheses -DDO_TPCCATRACKER_EFF_PERFORMANCE -DNonhomogeneousField -DCBM -DUSE_TIMERS) # -Weffc++ -Wnon-virtual-dtor -Woverloaded-virtual -Wold-style-cast : wait for other parts of cbmroot\root. EndIf() -IF (SSE_FOUND) +IF(SSE_FOUND) Message(STATUS "KFParticleInterface will be compiled with SSE support") ADD_DEFINITIONS(-DHAVE_SSE) - SET_SOURCE_FILES_PROPERTIES(${SRCS} PROPERTIES COMPILE_FLAGS - "-msse -O3") -ELSE (SSE_FOUND) + SET_SOURCE_FILES_PROPERTIES(${SRCS} PROPERTIES COMPILE_FLAGS + "-msse -O3") +ELSE(SSE_FOUND) MESSAGE(STATUS "KFParticleInterface will be compiled without SSE support") - SET_SOURCE_FILES_PROPERTIES(${SRCS} PROPERTIES COMPILE_FLAGS - "-O3") -ENDIF (SSE_FOUND) + SET_SOURCE_FILES_PROPERTIES(${SRCS} PROPERTIES COMPILE_FLAGS + "-O3") +ENDIF(SSE_FOUND) set(LINKDEF KFParticleInterfaceLinkDef.h) Set(LIBRARY_NAME KFParticleInterface) Set(DEPENDENCIES - KF KFQA Vc.a KFParticle L1 + Algo KF KFQA KFParticle L1 ) Set(DEFINITIONS -DDO_TPCCATRACKER_EFF_PERFORMANCE -DNonhomogeneousField -DCBM -DUSE_TIMERS) diff --git a/reco/KF/KFQA.cmake b/reco/KF/KFQA.cmake index 339202e24feaa760a9575894fef61c0cfb17d1de..cde5bf857efade0fb2a673ca4d8dc13d258b8bad 100644 --- a/reco/KF/KFQA.cmake +++ b/reco/KF/KFQA.cmake @@ -17,6 +17,8 @@ ${CBMDATA_DIR}/rich ${CBMDATA_DIR}/tof ${CBMDATA_DIR}/global +${CBMROOT_SOURCE_DIR}/algo + ${CBMROOT_SOURCE_DIR}/reco/KF ${CBMROOT_SOURCE_DIR}/reco/KF/Interface ${CBMROOT_SOURCE_DIR}/reco/KF/KFQA @@ -34,14 +36,13 @@ Include_Directories( ${INCLUDE_DIRECTORIES}) Set(SYSTEM_INCLUDE_DIRECTORIES ${KFParticle_INCLUDE_DIR} - ${VC_INCLUDE_DIRS} ${BASE_INCLUDE_DIRECTORIES} ) Include_Directories(SYSTEM ${SYSTEM_INCLUDE_DIRECTORIES}) set(LINK_DIRECTORIES -${Vc_LIB_DIR} +${Algo_LIB_DIR} ${KFParticle_LIB_DIR} ${FAIRROOT_LIBRARY_DIR} ${ROOT_LIBRARY_DIR} @@ -103,7 +104,7 @@ ENDIF (SSE_FOUND) set(LINKDEF KFQALinkDef.h) Set(LIBRARY_NAME KFQA) Set(DEPENDENCIES - KF Vc.a L1 KFParticle + Algo KF L1 KFParticle ) Set(DEFINITIONS -DDO_TPCCATRACKER_EFF_PERFORMANCE -DNonhomogeneousField -DCBM -DUSE_TIMERS) diff --git a/reco/L1/CMakeLists.txt b/reco/L1/CMakeLists.txt index 4bbf0d3ee48de423bf11c647b67b14579f51025d..e4a2eb298a1db893bab5c08d6e072746b3853f24 100644 --- a/reco/L1/CMakeLists.txt +++ b/reco/L1/CMakeLists.txt @@ -16,6 +16,8 @@ ELSE(SSE_FOUND) ENDIF(SSE_FOUND) Set(INCLUDE_DIRECTORIES + + ${CBMROOT_SOURCE_DIR}/algo ${CBMROOT_SOURCE_DIR}/reco/base ${CBMROOT_SOURCE_DIR}/reco/detectors/sts ${CBMROOT_SOURCE_DIR}/reco/detectors/rich @@ -63,7 +65,6 @@ Set(INCLUDE_DIRECTORIES Include_Directories(${INCLUDE_DIRECTORIES}) Set(SYSTEM_INCLUDE_DIRECTORIES - ${VC_INCLUDE_DIRS} ${BASE_INCLUDE_DIRECTORIES} ${KFParticle_INCLUDE_DIR} ) @@ -80,7 +81,7 @@ endif() Include_Directories(SYSTEM ${SYSTEM_INCLUDE_DIRECTORIES}) set(LINK_DIRECTORIES - ${Vc_LIB_DIR} + ${Algo_LIB_DIR} ${KFParticle_LIB_DIR} ${FAIRROOT_LIBRARY_DIR} ${ROOT_LIBRARY_DIR} @@ -247,7 +248,7 @@ Set(LINKDEF L1LinkDef.h) Set(LIBRARY_NAME L1) Set(DEPENDENCIES - Vc.a + Algo KF KFParticle Base @@ -305,7 +306,7 @@ Install(FILES CbmL1Counters.h L1Algo/L1Constants.h L1Algo/L1Utils.h L1Algo/L1NaN.h - L1Algo/L1SimdSerializer.h + L1Algo/L1SimdSerializer.h DESTINATION include ) @@ -316,8 +317,3 @@ Install(FILES L1Algo/L1Algo.h L1Algo/L1Vector.h DESTINATION include/L1Algo ) - -Install(FILES vectors/L1vec.h - vectors/L1vecVc.h - DESTINATION include/vectors -) diff --git a/reco/L1/L1Algo/L1CATrackFinder.cxx b/reco/L1/L1Algo/L1CATrackFinder.cxx index c7d63da86e1ab89b65f1b6e66f103e292930d449..9ef1489aaef6bfa42d504bb3b42a5f9a41ac53fa 100644 --- a/reco/L1/L1Algo/L1CATrackFinder.cxx +++ b/reco/L1/L1Algo/L1CATrackFinder.cxx @@ -895,11 +895,11 @@ inline void L1Algo::findTripletsStep0( // input T3.SetOneEntry(n3_4, T2, i2_4); u_front_3[n3_V][n3_4] = hitr.U(); u_back_3[n3_V][n3_4] = hitr.V(); - du_[n3_V][n3_4] = hitr.dU(); - dv_[n3_V][n3_4] = hitr.dV(); - z_Pos_3[n3_V][n3_4] = zr; - timeR[n3_V][n3_4] = hitr.time; - timeER[n3_V][n3_4] = hitr.timeEr; + du_[n3_V][n3_4] = hitr.dU(); + dv_[n3_V][n3_4] = hitr.dV(); + z_Pos_3[n3_V][n3_4] = zr; + timeR[n3_V][n3_4] = hitr.time; + timeER[n3_V][n3_4] = hitr.timeEr; n3++; n3_V = n3 / fvec::size(); @@ -1547,8 +1547,8 @@ inline void L1Algo::TripletsStaPort( /// creates triplets: L1Vector<fvec>& z_pos3 = fz_pos3[Thread]; L1Vector<fvec>& timeR = fTimeR[Thread]; L1Vector<fvec>& timeER = fTimeER[Thread]; - L1Vector<fvec>& du3 = du[Thread]; - L1Vector<fvec>& dv3 = dv[Thread]; + L1Vector<fvec>& du3 = du[Thread]; + L1Vector<fvec>& dv3 = dv[Thread]; T_3.clear(); hitsl_3.clear(); @@ -1573,8 +1573,7 @@ inline void L1Algo::TripletsStaPort( /// creates triplets: mrDuplets, // output - n3, T_3, hitsl_3, hitsm_3, hitsr_3, u_front3, u_back3, z_pos3, - du3, dv3, timeR, timeER); + n3, T_3, hitsl_3, hitsm_3, hitsr_3, u_front3, u_back3, z_pos3, du3, dv3, timeR, timeER); n3_V = (n3 + fvec::size() - 1) / fvec::size(); @@ -1590,8 +1589,7 @@ inline void L1Algo::TripletsStaPort( /// creates triplets: /// Add the right hits to parameters estimation. findTripletsStep1( // input - n3_V, star, u_front3, u_back3, z_pos3, - du3, dv3, timeR, timeER, + n3_V, star, u_front3, u_back3, z_pos3, du3, dv3, timeR, timeER, // output T_3); diff --git a/reco/L1/L1Algo/L1Def.h b/reco/L1/L1Algo/L1Def.h index cf4eda7de4ae445d1a4c7ff3dbbc34f267443c95..b372c25cabc22999546ec08512024f21b8c6735e 100644 --- a/reco/L1/L1Algo/L1Def.h +++ b/reco/L1/L1Algo/L1Def.h @@ -11,8 +11,6 @@ #include <assert.h> -#include "vectors/L1vec.h" - #ifdef FAST_CODE #define L1_NO_ASSERT // use with asserts, etc. @@ -67,5 +65,4 @@ typedef int index_type; - #endif diff --git a/reco/L1/L1Algo/L1NaN.h b/reco/L1/L1Algo/L1NaN.h index 55cf40a52780a3b6d6522b9c094515efafe0a2c6..ec516463036c430baa09cb605b838aa13814ac0e 100644 --- a/reco/L1/L1Algo/L1NaN.h +++ b/reco/L1/L1Algo/L1NaN.h @@ -18,6 +18,8 @@ #include <cmath> #include "L1Def.h" +#include "ca/simd/CaSimd.h" +using namespace cbm::algo::ca; // TODO: remove "using" from headers /// Namespace L1NaN defines functions to set variables to NaN and check wether they are NaN or not /// diff --git a/reco/L1/L1Algo/L1SimdSerializer.h b/reco/L1/L1Algo/L1SimdSerializer.h index 3a8b0e373f9fcb33ffef7d39f4d134344345f85d..4b7a4dd4cb8706d186d608c740eaacd8d4c87f82 100644 --- a/reco/L1/L1Algo/L1SimdSerializer.h +++ b/reco/L1/L1Algo/L1SimdSerializer.h @@ -13,7 +13,7 @@ #include <boost/serialization/access.hpp> #include <boost/serialization/split_free.hpp> -#include "vectors/L1vec.h" +#include "ca/simd/CaSimd.h" /// This header defines functionality for saving and loading SIMDized vectors. At the moment, only the first element of /// the vector can be saved, and the loaded vector will be horizontally equal. /// diff --git a/reco/L1/OffLineInterface/CbmL1RichENNRingFinderParallel.h b/reco/L1/OffLineInterface/CbmL1RichENNRingFinderParallel.h index fec973655b31fe7b328641753456b26968f3660b..bed36ac9f58a4b71eb550a13674eec83bf721e73 100644 --- a/reco/L1/OffLineInterface/CbmL1RichENNRingFinderParallel.h +++ b/reco/L1/OffLineInterface/CbmL1RichENNRingFinderParallel.h @@ -24,9 +24,8 @@ #include "CbmRichRingFinder.h" -#include "vectors/L1vec.h" -//#include "../vectors/PSEUDO_F32vec4.h" // for check -//#include "../vectors/PSEUDO_F32vec1.h" // for check +#include "ca/simd/CaSimd.h" +using namespace cbm::algo::ca; // TODO: remove "using" from headers #include "TStopwatch.h" #include "TString.h" diff --git a/reco/L1/ParticleFinder/CbmL1PFFitter.cxx b/reco/L1/ParticleFinder/CbmL1PFFitter.cxx index 8ec8617c0a3f3d330fc0655f3bd267c393faf33f..9d4d40709fab3f62a14ede609914290e7650062a 100644 --- a/reco/L1/ParticleFinder/CbmL1PFFitter.cxx +++ b/reco/L1/ParticleFinder/CbmL1PFFitter.cxx @@ -37,6 +37,7 @@ #include "KFParticleDatabase.h" #include "L1Algo.h" // Also defines L1Parameters +#include "L1Def.h" #include "L1Extrapolation.h" #include "L1Filtration.h" #include "L1Fit.h" @@ -59,7 +60,7 @@ CbmL1PFFitter::CbmL1PFFitter() {} CbmL1PFFitter::~CbmL1PFFitter() {} -void CbmL1PFFitter::FilterFirst(L1TrackPar& track, fvec& x, fvec& y, L1Station& st) +void FilterFirst(L1TrackPar& track, fvec& x, fvec& y, L1Station& st) { track.C00 = st.XYInfo.C00; track.C10 = st.XYInfo.C10; diff --git a/reco/L1/ParticleFinder/CbmL1PFFitter.h b/reco/L1/ParticleFinder/CbmL1PFFitter.h index 4c08cf58595bb88fc3872a1189d9aea8da266630..946e7c747e3e50c2ef21bd52c5149ed9cc3f7078 100644 --- a/reco/L1/ParticleFinder/CbmL1PFFitter.h +++ b/reco/L1/ParticleFinder/CbmL1PFFitter.h @@ -22,8 +22,6 @@ #include <vector> -#include "L1Def.h" - class CbmL1Track; class CbmStsTrack; class L1TrackPar; @@ -38,8 +36,6 @@ public: CbmL1PFFitter(); ~CbmL1PFFitter(); - void FilterFirst(L1TrackPar& track, fvec& x, fvec& y, L1Station& st); - //functions for fitting CbmStsTrack void Fit(std::vector<CbmStsTrack>& Tracks, std::vector<int>& pidHypo); void CalculateFieldRegion(std::vector<CbmStsTrack>& Tracks, std::vector<L1FieldRegion>& Field); diff --git a/reco/L1/vectors/L1vecPseudo.h b/reco/L1/vectors/L1vecPseudo.h deleted file mode 100644 index ad0af0e0dc57768c69ea6c975b9013961f1e7101..0000000000000000000000000000000000000000 --- a/reco/L1/vectors/L1vecPseudo.h +++ /dev/null @@ -1,267 +0,0 @@ -/* Copyright (C) 2010 Frankfurt Institute for Advanced Studies, Goethe-Universität Frankfurt, Frankfurt - SPDX-License-Identifier: GPL-3.0-only - Authors: Igor Kulakov [committer] */ - -#ifndef L1vecPseudo_H -#define L1vecPseudo_H - -#include <iomanip> -#include <iostream> - -#include <cmath> - -typedef float fscal; - -/********************************** - * - * Pseudo SIMD vector - * - **********************************/ - -fscal min(fscal x, fscal y); -fscal max(fscal x, fscal y); -fscal asgnb(fscal x, fscal y); -fscal sgn(fscal x); - - -class fmask { - -public: - static constexpr int Size {4}; - - static constexpr size_t size() { return Size; } - - bool v[Size]; - - bool& operator[](size_t i) { return v[i]; } - bool operator[](size_t i) const { return v[i]; } - - fmask() : fmask(0.f) {} - - fmask(const fmask& a) - { - for (size_t i = 0; i < size(); i++) { - v[i] = a.v[i]; - } - } - - fmask(bool a) - { - for (size_t i = 0; i < size(); i++) { - v[i] = a; - } - } - - static fmask One() { return fmask(true); } - - static fmask Zero() { return fmask(false); } - -#define _op(A, B, F) \ - fmask z; \ - for (size_t i = 0; i < size(); i++) { \ - z[i] = (A[i] F B[i]); \ - } \ - return z; - - /* Logic */ - friend fmask operator&&(const fmask& a, const fmask& b) { _op(a, b, &&) } - friend fmask operator||(const fmask& a, const fmask& b) { _op(a, b, ||) } - friend fmask operator&(const fmask& a, const fmask& b) { _op(a, b, &) } - friend fmask operator|(const fmask& a, const fmask& b) { _op(a, b, |) } - friend fmask operator^(const fmask& a, const fmask& b) { _op(a, b, ^) } - -#undef _op - - friend fmask operator!(const fmask& a) - { - fmask z; - for (size_t i = 0; i < size(); i++) { - z[i] = !a[i]; - } - return z; - } - - bool isEmpty() - { - bool ret = true; - for (size_t i = 0; i < size(); i++) { - ret = ret && (!v[i]); - } - return ret; - } - - bool isNotEmpty() { return !isEmpty(); } - - - friend std::ostream& operator<<(std::ostream& strm, const fmask& a) - { - strm << '['; - for (size_t i = 0; i < size(); i++) { - strm << std::setw(12) << std::setfill(' ') << a[i] << ' '; - } - return strm; - } - - friend std::istream& operator>>(std::istream& strm, fmask& a) - { - for (size_t i = 0; i < size(); i++) { - strm >> a[i]; - } - return strm; - } -}; - - -class fvec { - -public: - static constexpr size_t size() { return fmask::size(); } - - fscal v[fmask::Size]; - - fvec() : fvec(0.) {} - - fvec(const fvec& a) - { - for (size_t i = 0; i < size(); i++) { - v[i] = a.v[i]; - } - } - - fvec(fscal a) - { - for (size_t i = 0; i < size(); i++) { - v[i] = a; - } - } - - static fvec One() { return fvec(1.); } - - static fvec Zero() { return fvec(0.); } - - fscal& operator[](size_t i) { return v[i]; } - - fscal operator[](size_t i) const { return v[i]; } - - void setZero(fmask m) - { - for (size_t i = 0; i < size(); i++) { - if (m[i]) { v[i] = 0.; } - } - } - -#define _f1(A, F) \ - fvec z; \ - for (size_t i = 0; i < size(); i++) { \ - z[i] = F(A[i]); \ - } \ - return z; - -#define _f2(A, B, F) \ - fvec z; \ - for (size_t i = 0; i < size(); i++) { \ - z[i] = F(A[i], B[i]); \ - } \ - return z; - -#define _op(A, B, F) \ - fvec z; \ - for (size_t i = 0; i < size(); i++) { \ - z[i] = (A[i] F B[i]); \ - } \ - return z; - -#define _opComp(A, B, F) \ - fmask z; \ - for (size_t i = 0; i < size(); i++) { \ - z[i] = (A[i] F B[i]); \ - } \ - return z; - - - /* Arithmetic Operators */ - friend fvec operator+(const fvec& a, const fvec& b) { _op(a, b, +) } - friend fvec operator-(const fvec& a, const fvec& b) { _op(a, b, -) } - friend fvec operator*(const fvec& a, const fvec& b) { _op(a, b, *) } - friend fvec operator/(const fvec& a, const fvec& b) { _op(a, b, /) } - - /* Comparison */ - friend fmask operator<(const fvec& a, const fvec& b) { _opComp(a, b, <) } - friend fmask operator<=(const fvec& a, const fvec& b) { _opComp(a, b, <=) } - friend fmask operator>(const fvec& a, const fvec& b) { _opComp(a, b, >) } - friend fmask operator>=(const fvec& a, const fvec& b) { _opComp(a, b, >=) } - friend fmask operator==(const fvec& a, const fvec& b) { _opComp(a, b, ==) } - - friend fmask isnan(const fvec& a) - { - fmask m; - for (size_t i = 0; i < size(); i++) { - m[i] = std::isnan(a[i]); - } - return m; - } - - friend fvec iif(fmask a, fvec b, fvec c) - { - fvec z; - for (size_t i = 0; i < size(); i++) { - z[i] = a[i] ? b[i] : c[i]; - } - return z; - } - - /* Functions */ - friend fscal min(fscal x, fscal y) { return x < y ? x : y; } - friend fscal max(fscal x, fscal y) { return x < y ? y : x; } - friend fscal asgnb(fscal x, fscal y) { return y >= 0.f ? fabs(x) : -fabs(x); } - friend fscal sgn(fscal x) { return x >= 0.f ? 1.f : -1.f; } - - friend fvec min(const fvec& a, const fvec& b) { _f2(a, b, min) } - friend fvec max(const fvec& a, const fvec& b) { _f2(a, b, max) } - friend fvec asgnb(const fvec& a, const fvec& b) { _f2(a, b, asgnb) } - friend fvec sqrt(const fvec& a) { _f1(a, sqrt) } - friend fvec abs(const fvec& a) { _f1(a, fabs) } - friend fvec sgn(const fvec& a) { _f1(a, sgn) } - friend fvec exp(const fvec& a) { _f1(a, exp) } - friend fvec log(const fvec& a) { _f1(a, log) } - friend fvec sin(const fvec& a) { _f1(a, sin) } - friend fvec cos(const fvec& a) { _f1(a, cos) } -#undef _f1 -#undef _f2 -#undef _op -#undef _opComp - - /* Define all operators for consistensy */ - - friend fvec operator-(const fvec& a) { return fvec(0) - a; } - friend fvec operator+(const fvec& a) { return a; } - - friend void operator+=(fvec& a, const fvec& b) { a = a + b; } - friend void operator-=(fvec& a, const fvec& b) { a = a - b; } - friend void operator*=(fvec& a, const fvec& b) { a = a * b; } - friend void operator/=(fvec& a, const fvec& b) { a = a / b; } - - friend std::ostream& operator<<(std::ostream& strm, const fvec& a) - { - //strm << "[" << a[0] << " " << a[1] << " " << a[2] << " " << a[3] << "]"; - strm << '['; - for (size_t i = 0; i < size(); i++) { - strm << std::setw(12) << std::setfill(' ') << a[i] << ' '; - } - return strm; - } - - friend std::istream& operator>>(std::istream& strm, fvec& a) - { - for (size_t i = 0; i < size(); i++) { - strm >> a[i]; - } - return strm; - } - -} __attribute__((aligned(16))); - -#define _fvecalignment __attribute__((aligned(fvec::size() * sizeof(fscal)))) - - -#endif diff --git a/reco/eventbuilder/CMakeLists.txt b/reco/eventbuilder/CMakeLists.txt index dbbd738472b2f6b9fb19a0acb7dcb64c20742141..b63dca16d786d77248f32ed49c195b0a7b7ad691 100644 --- a/reco/eventbuilder/CMakeLists.txt +++ b/reco/eventbuilder/CMakeLists.txt @@ -22,6 +22,7 @@ ${CBMDATA_DIR}/tof ${CBMDATA_DIR}/psd ${CBMDATA_DIR}/global +${CBMROOT_SOURCE_DIR}/algo ${CBMROOT_SOURCE_DIR}/reco/L1 ${CBMROOT_SOURCE_DIR}/reco/L1/L1Algo @@ -89,7 +90,7 @@ ENDIF (SSE_FOUND) set(LINKDEF CbmEventBuilderLinkDef.h) Set(LIBRARY_NAME CbmEventBuilder) Set(DEPENDENCIES - CbmData CbmBase CbmField CbmStsBase CbmMvd Base CbmQaBase Vc.a + Algo CbmData CbmBase CbmField CbmStsBase CbmMvd Base CbmQaBase ) GENERATE_LIBRARY() diff --git a/reco/littrack/CMakeLists.txt b/reco/littrack/CMakeLists.txt index cb31c94913acfd097b6d285354ad8772ea1a28d5..f50d7d29ed2111c2f3d2fe0f7f1371aa32f648ff 100644 --- a/reco/littrack/CMakeLists.txt +++ b/reco/littrack/CMakeLists.txt @@ -22,6 +22,7 @@ ${CMAKE_CURRENT_SOURCE_DIR}/cbm/qa/fieldapr ${CMAKE_CURRENT_SOURCE_DIR}/cbm/qa/radlength ${CMAKE_CURRENT_SOURCE_DIR}/cbm/qa/tof +${CBMROOT_SOURCE_DIR}/algo ${CBMROOT_SOURCE_DIR}/reco/base # needed only for the LitrackQA library @@ -50,7 +51,6 @@ ${CBMDETECTORBASE_DIR}/rich/utils ${CBMROOT_SOURCE_DIR}/reco/KF ${CBMROOT_SOURCE_DIR}/reco/KF/Interface -${CBMROOT_SOURCE_DIR}/reco/L1/vectors ${CBMROOT_SOURCE_DIR}/run ) @@ -65,6 +65,7 @@ Set(SYSTEM_INCLUDE_DIRECTORIES Include_Directories(SYSTEM ${SYSTEM_INCLUDE_DIRECTORIES}) set(LINK_DIRECTORIES +${Algo_LIB_DIR} ${KFParticle_LIB_DIR} ${FAIRROOT_LIBRARY_DIR} ${ROOT_LIBRARY_DIR} @@ -182,7 +183,7 @@ EndIf (Boost_FOUND) set(LINKDEF LittrackLinkDef.h) Set(LIBRARY_NAME Littrack) Set(DEPENDENCIES - Littrackparallel KF KFParticleInterface L1 CbmMuchBase CbmStsBase CbmRichBase CbmRecoBase CbmBase CbmData + Algo Littrackparallel KF KFParticleInterface CbmMuchBase CbmStsBase CbmRichBase CbmRecoBase CbmBase CbmData CbmTofBase Base ) GENERATE_LIBRARY() diff --git a/reco/littrack/parallel/CMakeLists.txt b/reco/littrack/parallel/CMakeLists.txt index 8aa95f147cdc127064c8adbc864833759803516d..73edc0172eb7c8cf98dc75790d98b43aadb99986 100644 --- a/reco/littrack/parallel/CMakeLists.txt +++ b/reco/littrack/parallel/CMakeLists.txt @@ -1,13 +1,14 @@ # Create a library called "libLittrackparallel". set(INCLUDE_DIRECTORIES - ${CBMROOT_SOURCE_DIR}/reco/L1/vectors + ${CBMROOT_SOURCE_DIR}/algo ) include_directories(${INCLUDE_DIRECTORIES}) set(LINK_DIRECTORIES ${Vc_LIB_DIR} + ${Algo_LIB_DIR} ) link_directories(${LINK_DIRECTORIES}) @@ -35,7 +36,7 @@ ENDIF(SSE_FOUND) add_library(Littrackparallel SHARED ${LITTRACKPARALLEL_SRCS}) set_target_properties(Littrackparallel PROPERTIES ${FAIRROOT_LIBRARY_PROPERTIES}) -target_link_libraries(Littrackparallel Vc.a) +target_link_libraries(Littrackparallel Algo Vc.a) # install(TARGETS Littrackparallel DESTINATION ${CMAKE_BINARY_DIR}/lib) install(TARGETS Littrackparallel DESTINATION lib) diff --git a/reco/littrack/parallel/LitTypes.h b/reco/littrack/parallel/LitTypes.h index ebb98961d3a47cd4a0b8c041c791655732246624..b3bbff2476ab64670dfc3fb42915edc4f21b5f45 100644 --- a/reco/littrack/parallel/LitTypes.h +++ b/reco/littrack/parallel/LitTypes.h @@ -12,6 +12,9 @@ #ifndef LITTYPES_H_ #define LITTYPES_H_ -#include "L1vecVc.h" +#include "ca/simd/CaSimd.h" + +using cbm::algo::ca::fscal; +using cbm::algo::ca::fvec; #endif /* LITTYPES_H_ */ diff --git a/reco/littrack/parallel/vectors/P4_F32vec4.h b/reco/littrack/parallel/vectors/P4_F32vec4.h deleted file mode 100644 index 7361b284e81fbd28a69ba71a10e8d47f44c37b0a..0000000000000000000000000000000000000000 --- a/reco/littrack/parallel/vectors/P4_F32vec4.h +++ /dev/null @@ -1,160 +0,0 @@ -/* Copyright (C) 2010-2014 GSI/JINR-LIT, Darmstadt/Dubna - SPDX-License-Identifier: GPL-3.0-only - Authors: Andrey Lebedev [committer] */ - -#ifndef LIT_F32VEC4P4_H -#define LIT_F32VEC4P4_H - - -#include <iostream> - -#include <cmath> - -#include "vec_arithmetic.h" -#include "xmmintrin.h" - -/********************************** - * - * Vector of four single floats - * - **********************************/ - -//#pragma pack(push,16)/* Must ensure class & union 16-B aligned */ - -//typedef __m128 VectorFloat __attribute__ ((aligned(16))); - -const union { - float f; - int i; -} __f_one = {(float) 1.}; - -const union { - int i[4]; - __m128 m; -} __f32vec4_abs_mask_cheat = {{0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff}}, - __f32vec4_sgn_mask_cheat = {{static_cast<int>(0x80000000), static_cast<int>(0x80000000), static_cast<int>(0x80000000), - static_cast<int>(0x80000000)}}, - __f32vec4_zero_cheat = {{0, 0, 0, 0}}, __f32vec4_one_cheat = {{__f_one.i, __f_one.i, __f_one.i, __f_one.i}}, - __f32vec4_true_cheat = {{static_cast<int>(0xFFFFFFFF), static_cast<int>(0xFFFFFFFF), static_cast<int>(0xFFFFFFFF), - static_cast<int>(0xFFFFFFFF)}}, - __f32vec4_false_cheat = {{0x00000000, 0x00000000, 0x00000000, 0x00000000}}; - -#define _f32vec4_abs_mask ((F32vec4) __f32vec4_abs_mask_cheat.m) -#define _f32vec4_sgn_mask ((F32vec4) __f32vec4_sgn_mask_cheat.m) -#define _f32vec4_zero ((F32vec4) __f32vec4_zero_cheat.m) -#define _f32vec4_one ((F32vec4) __f32vec4_one_cheat.m) -#define _f32vec4_true ((F32vec4) __f32vec4_true_cheat.m) -#define _f32vec4_false ((F32vec4) __f32vec4_false_cheat.m) - -class F32vec4 { -public: - __m128 v; - - float& operator[](int i) { return ((float*) &v)[i]; } - float operator[](int i) const { return ((float*) &v)[i]; } - - F32vec4() : v(_mm_set_ps1(0)) {} - F32vec4(const __m128& a) : v(a) {} - F32vec4(const float& a) : v(_mm_set_ps1(a)) {} - - F32vec4(const float& f0, const float& f1, const float& f2, const float& f3) : v(_mm_set_ps(f3, f2, f1, f0)) {} - - /* Conversion function */ - operator __m128() const { return v; } /* Convert to __m128 */ - - /* Arithmetic Operators */ - friend F32vec4 operator+(const F32vec4& a, const F32vec4& b) { return _mm_add_ps(a, b); } - friend F32vec4 operator-(const F32vec4& a, const F32vec4& b) { return _mm_sub_ps(a, b); } - friend F32vec4 operator*(const F32vec4& a, const F32vec4& b) { return _mm_mul_ps(a, b); } - friend F32vec4 operator/(const F32vec4& a, const F32vec4& b) { return _mm_div_ps(a, b); } - - /* Functions */ - friend F32vec4 min(const F32vec4& a, const F32vec4& b) { return _mm_min_ps(a, b); } - friend F32vec4 max(const F32vec4& a, const F32vec4& b) { return _mm_max_ps(a, b); } - - /* Square Root */ - friend F32vec4 sqrt(const F32vec4& a) { return _mm_sqrt_ps(a); } - - /* Reciprocal( inverse) Square Root */ - friend F32vec4 rsqrt(const F32vec4& a) { return _mm_rsqrt_ps(a); } - - /* Reciprocal (inversion) */ - friend F32vec4 rcp(const F32vec4& a) { return _mm_rcp_ps(a); } - //friend F32vec4 rcp ( const F32vec4 &a ){ return 1./a; } - - /* Absolute value */ - friend F32vec4 fabs(const F32vec4& a) { return _mm_and_ps(a, _f32vec4_abs_mask); } - - /* Sign */ - friend F32vec4 sgn(const F32vec4& a) { return _mm_or_ps(_mm_and_ps(a, _f32vec4_sgn_mask), _f32vec4_one); } - friend F32vec4 asgnb(const F32vec4& a, const F32vec4& b) { return _mm_or_ps(_mm_and_ps(b, _f32vec4_sgn_mask), a); } - - /* Logical */ - - friend F32vec4 operator&(const F32vec4& a, const F32vec4& b) - { // mask returned - return _mm_and_ps(a, b); - } - friend F32vec4 operator|(const F32vec4& a, const F32vec4& b) - { // mask returned - return _mm_or_ps(a, b); - } - friend F32vec4 operator^(const F32vec4& a, const F32vec4& b) - { // mask returned - return _mm_xor_ps(a, b); - } - friend F32vec4 operator!(const F32vec4& a) - { // mask returned - return _mm_xor_ps(a, _f32vec4_true); - } - //friend F32vec4 operator||( const F32vec4& a, const F32vec4& b ) { // mask returned - // return _mm_or_ps(a, b); - //} - - /* Comparison */ - - friend F32vec4 operator<(const F32vec4& a, const F32vec4& b) - { // mask returned - return _mm_cmplt_ps(a, b); - } - - /* Non intrinsic functions */ - -#define _f1(A, F) F32vec4(F(A[0]), F(A[1]), F(A[2]), F(A[3])) - - friend F32vec4 exp(const F32vec4& a) { return _f1(a, exp); } - friend F32vec4 log(const F32vec4& a) { return _f1(a, log); } - friend F32vec4 sin(const F32vec4& a) { return _f1(a, sin); } - friend F32vec4 cos(const F32vec4& a) { return _f1(a, cos); } - -#undef _f1 - - /* Define all operators for consistensy */ - - vec_arithmetic(F32vec4, float); - - friend std::ostream& operator<<(std::ostream& strm, const F32vec4& a) - { - strm << a[0] << " " << a[1] << " " << a[2] << " " << a[3]; - return strm; - } - - friend std::istream& operator>>(std::istream& strm, F32vec4& a) - { - float tmp; - strm >> tmp; - a = tmp; - return strm; - } - -} __attribute__((aligned(16))); - - -typedef F32vec4 fvec; -typedef float fscal; -const int fvecLen = 4; -//#define fvec_true _f32vec4_true -//#define fvec_false _f32vec4_false -#define _fvecalignment __attribute__((aligned(16))) - -#endif diff --git a/reco/littrack/parallel/vectors/PSEUDO_F32vec1.h b/reco/littrack/parallel/vectors/PSEUDO_F32vec1.h deleted file mode 100644 index 5d63232f6040383cdd50b8ac9acc1f63b0e56da1..0000000000000000000000000000000000000000 --- a/reco/littrack/parallel/vectors/PSEUDO_F32vec1.h +++ /dev/null @@ -1,105 +0,0 @@ -/* Copyright (C) 2010-2013 GSI/JINR-LIT, Darmstadt/Dubna - SPDX-License-Identifier: GPL-3.0-only - Authors: Andrey Lebedev [committer] */ - -#ifndef LIT_F32VEC1_H -#define LIT_F32VEC1_H - -#include <iostream> - -#include <cmath> - -/********************************** - * - * Vector of one single float - * - **********************************/ - -//const union { -// int i[1]; -// float m; -//} -//__f32vec1_true_cheat = {0xFFFFFFFF}, -//__f32vec1_false_cheat = {0x00000000}; - -//#define _f32vec1_true ((F32vec1)__f32vec1_true_cheat.m) -//#define _f32vec1_false ((F32vec1)__f32vec1_false_cheat.m) - -class F32vec1 { -public: - float v; - - float& operator[](int i) { return v; } - float operator[](int i) const { return v; } - - F32vec1() {} - F32vec1(const float& v0) { v = v0; } - - /* Conversion function */ - operator float() const { return v; } /* Convert to __m128 */ - - /* Arithmetic Operators */ - - /* Functions */ - //friend F32vec1 min( const F32vec1 &a, const F32vec1 &b ){ return a<b ?a :b; } - //friend F32vec1 max( const F32vec1 &a, const F32vec1 &b ){ return a>b ?a :b; } - - /* Square Root */ - - /* Reciprocal( inverse) Square Root */ - //friend F32vec1 rsqrt( const F32vec1 &a ){ return 1./sqrt(a); } - - /* Reciprocal (inversion) */ - friend F32vec1 rcp(const F32vec1& a) { return 1. / a; } - - /* Absolute value */ - //friend F32vec1 fabs(const F32vec1 &a){ return fabs(a); } - - /* Sign */ - //friend F32vec1 sgn(const F32vec1 &a){ return a<0 ?-1 :(a>0 ?1 :0); } - - /* Logical */ - /* - friend F32vec1 operator&( const F32vec1 &a, const F32vec1 &b ){ // mask returned - F32vec1 tmp; - int *x = (int*)&tmp; - int *y = (int*)&a; - int *z = (int*)&b; - x[0] = y[0] & z[0]; - x[1] = y[1] & z[1]; - return tmp; - } - */ - /* Non intrinsic functions */ - - /* Define all operators for consistensy */ - - friend void operator+=(F32vec1& a, const F32vec1& b) { a = a + b; } - friend void operator-=(F32vec1& a, const F32vec1& b) { a = a - b; } - friend void operator*=(F32vec1& a, const F32vec1& b) { a = a * b; } - friend void operator/=(F32vec1& a, const F32vec1& b) { a = a / b; } - - friend std::ostream& operator<<(std::ostream& strm, const F32vec1& a) - { - strm << a[0]; - return strm; - } - - friend std::istream& operator>>(std::istream& strm, F32vec1& a) - { - float tmp; - strm >> tmp; - a = tmp; - return strm; - } - -}; //__attribute__ ((aligned(16)));; - -typedef F32vec1 fvec; -const int fvecLen = 1; -typedef float fscal; -//#define fvec_true _f32vec1_true -//#define fvec_false _f32vec1_false -#define _fvecalignment - -#endif diff --git a/reco/littrack/parallel/vectors/vec_arithmetic.h b/reco/littrack/parallel/vectors/vec_arithmetic.h deleted file mode 100644 index 8b98dce71b6d47578e70bac562adc60424d1fa18..0000000000000000000000000000000000000000 --- a/reco/littrack/parallel/vectors/vec_arithmetic.h +++ /dev/null @@ -1,30 +0,0 @@ -/* Copyright (C) 2010-2014 GSI/JINR-LIT, Darmstadt/Dubna - SPDX-License-Identifier: GPL-3.0-only - Authors: Andrey Lebedev [committer] */ - -#ifndef LIT_VEC_ARITHMETIC_H -#define LIT_VEC_ARITHMETIC_H - -/* Define all operators after definition of basic operators */ - -#define vec_arithmetic(V, S) \ - friend V operator-(const V& a) { return V(0) - a; } \ - friend V operator+(const V& a) { return a; } \ - friend V operator+(const V& a, const S& b) { return a + V(b); } \ - friend V operator-(const V& a, const S& b) { return a - V(b); } \ - friend V operator*(const V& a, const S& b) { return a * V(b); } \ - friend V operator/(const V& a, const S& b) { return a / V(b); } \ - friend V operator+(const S& a, const V& b) { return V(a) + b; } \ - friend V operator-(const S& a, const V& b) { return V(a) - b; } \ - friend V operator*(const S& a, const V& b) { return V(a) * b; } \ - friend V operator/(const S& a, const V& b) { return V(a) / b; } \ - friend void operator+=(V& a, const V& b) { a = a + b; } \ - friend void operator-=(V& a, const V& b) { a = a - b; } \ - friend void operator*=(V& a, const V& b) { a = a * b; } \ - friend void operator/=(V& a, const V& b) { a = a / b; } \ - friend void operator+=(V& a, const S& b) { a = a + b; } \ - friend void operator-=(V& a, const S& b) { a = a - b; } \ - friend void operator*=(V& a, const S& b) { a = a * b; } \ - friend void operator/=(V& a, const S& b) { a = a / b; } - -#endif