Skip to content

Commit dcef287

Browse files
add c++ executable for benchmarking libjetreconstruction (#5)
* add c++ executable for benchmarking libjetreconstruction * add compatibility with juliac compiled lib * control garbage collector, add finding libjulia * fix manual gc collect so it actually sweeps something * update readme * add cjetreconstruction backend to benchmark.jl * point to 1.12 nightlies in the readme * add comment on libstdc++ version for julia 1.12 * update readme * update to use recombination schemes and immutable PseudoJets * fix power/alg arguments * sort output only when dumping * fix missing alg argument * add GenKt * Argument consistency Make -m and -n arguments consistent with other wrappers --------- Co-authored-by: Graeme Andrew Stewart <[email protected]>
1 parent 16d3bf6 commit dcef287

File tree

10 files changed

+1953
-26
lines changed

10 files changed

+1953
-26
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
*.hepmc3
44
.DS_Store
55
test*
6+
.cache

cjetreconstruction/.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
*.d
2+
*.dSYM
3+
*.out
4+
*.json
5+
build
6+
results/

cjetreconstruction/CMakeLists.txt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# CMake file for benchmark and validation of JetReconstruction.jl C-bindings
2+
#
3+
# (C) CERN, 2025
4+
# MIT License
5+
6+
cmake_minimum_required(VERSION 3.12)
7+
project(JetReconstructionBenchmarks)
8+
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
9+
10+
find_package(HepMC3 REQUIRED)
11+
find_package(JetReconstruction REQUIRED)
12+
find_package(Julia REQUIRED) # Find Julia for GC utilities
13+
14+
set(CMAKE_CXX_STANDARD 17)
15+
16+
# JetReconstruction.jl C-bindings executable runs reconstruction then outputs either
17+
# exclusive or inclusive jets
18+
add_executable(cjetreconstruction-finder
19+
src/cjetreconstruction-finder.cc
20+
src/cjetreconstruction-utils.cc
21+
)
22+
23+
target_include_directories(cjetreconstruction-finder PRIVATE ${Julia_INCLUDE_DIRS})
24+
target_link_libraries(cjetreconstruction-finder
25+
HepMC3::HepMC3
26+
JetReconstruction::JetReconstruction ${Julia_LIBRARY}
27+
)

cjetreconstruction/README.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# JetReconstruction.jl C-bindings Test Applications
2+
3+
Benchmark application using the JetReconstruction.jl statically compiled to a shared library.
4+
5+
## Compilation
6+
7+
Configure and compile using CMake in the standard way, e.g.,
8+
9+
```sh
10+
cmake -S . -B build
11+
# or if libjectreconstruction is installed in non-standard location
12+
# JetReconstruction_DIR=<JetReconstruction-installation-location> cmake -S . -B build
13+
cmake --build build
14+
```
15+
16+
> [!NOTE]
17+
> Make sure to find the same version of Julia that was used to compile the JetReconstruction package.
18+
> Custom search path can be set with `Julia_ROOT`, for instance:
19+
>
20+
> ```sh
21+
> Julia_ROOT=${HOME}/.julia/juliaup/julia-1.12/ cmake -S . -B build
22+
> ```
23+
>
24+
> Also make sure that for Julia 1.12 at least GLIBCXX_3.4.30 (gcc 12.1.0) is used.
Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
# File taken from JuliaInteroplibcxxwrap-julia v0.13.4
2+
# MIT License
3+
# Copyright (c) 2015: Bart Janssens
4+
5+
# Original FindJulia.cmake from https://github.com/QuantStack/xtensor-julia-cookiecutter/blob/master/%7B%7Bcookiecutter.github_project_name%7D%7D/cmake/FindJulia.cmake
6+
7+
if(Julia_FOUND)
8+
return()
9+
endif()
10+
11+
####################
12+
# Julia Executable #
13+
####################
14+
15+
if(Julia_PREFIX)
16+
message(STATUS "Adding path ${Julia_PREFIX} to search path")
17+
list(APPEND CMAKE_PREFIX_PATH ${Julia_PREFIX})
18+
message(STATUS "THIS BRANCH")
19+
else()
20+
find_program(Julia_EXECUTABLE julia DOC "Julia executable")
21+
message(STATUS "Found Julia executable: " ${Julia_EXECUTABLE})
22+
endif()
23+
24+
#################
25+
# Julia Version #
26+
#################
27+
28+
if(Julia_EXECUTABLE)
29+
execute_process(
30+
COMMAND "${Julia_EXECUTABLE}" --startup-file=no --version
31+
OUTPUT_VARIABLE Julia_VERSION_STRING
32+
)
33+
else()
34+
find_file(Julia_VERSION_INCLUDE julia_version.h PATH_SUFFIXES include/julia)
35+
file(READ ${Julia_VERSION_INCLUDE} Julia_VERSION_STRING)
36+
string(REGEX MATCH "JULIA_VERSION_STRING.*" Julia_VERSION_STRING ${Julia_VERSION_STRING})
37+
endif()
38+
39+
string(
40+
REGEX REPLACE ".*([0-9]+\\.[0-9]+\\.[0-9]+).*" "\\1"
41+
Julia_VERSION_STRING "${Julia_VERSION_STRING}"
42+
)
43+
44+
MESSAGE(STATUS "Julia_VERSION_STRING: ${Julia_VERSION_STRING}")
45+
46+
##################
47+
# Julia Includes #
48+
##################
49+
50+
set(JULIA_HOME_NAME "Sys.BINDIR")
51+
if(${Julia_VERSION_STRING} VERSION_LESS "0.7.0")
52+
set(JULIA_HOME_NAME "JULIA_HOME")
53+
else()
54+
set(USING_LIBDL "using Libdl")
55+
endif()
56+
57+
if(DEFINED ENV{JULIA_INCLUDE_DIRS})
58+
set(Julia_INCLUDE_DIRS $ENV{JULIA_INCLUDE_DIRS}
59+
CACHE STRING "Location of Julia include files")
60+
elseif(Julia_EXECUTABLE)
61+
execute_process(
62+
COMMAND ${Julia_EXECUTABLE} --startup-file=no -E "julia_include_dir = joinpath(match(r\"(.*)(bin)\",${JULIA_HOME_NAME}).captures[1],\"include\",\"julia\")\n
63+
if !isdir(julia_include_dir) # then we're running directly from build\n
64+
julia_base_dir_aux = splitdir(splitdir(${JULIA_HOME_NAME})[1])[1] # useful for running-from-build\n
65+
julia_include_dir = joinpath(julia_base_dir_aux, \"usr\", \"include\" )\n
66+
julia_include_dir *= \";\" * joinpath(julia_base_dir_aux, \"src\", \"support\" )\n
67+
julia_include_dir *= \";\" * joinpath(julia_base_dir_aux, \"src\" )\n
68+
end\n
69+
julia_include_dir"
70+
OUTPUT_VARIABLE Julia_INCLUDE_DIRS
71+
)
72+
73+
string(REGEX REPLACE "\"" "" Julia_INCLUDE_DIRS "${Julia_INCLUDE_DIRS}")
74+
string(REGEX REPLACE "\n" "" Julia_INCLUDE_DIRS "${Julia_INCLUDE_DIRS}")
75+
set(Julia_INCLUDE_DIRS ${Julia_INCLUDE_DIRS}
76+
CACHE PATH "Location of Julia include files")
77+
elseif(Julia_PREFIX)
78+
set(Julia_INCLUDE_DIRS ${Julia_PREFIX}/include/julia)
79+
endif()
80+
set(Julia_INCLUDE_DIRS ${Julia_INCLUDE_DIRS};$ENV{includedir})
81+
MESSAGE(STATUS "Julia_INCLUDE_DIRS: ${Julia_INCLUDE_DIRS}")
82+
83+
###################
84+
# Julia Libraries #
85+
###################
86+
87+
if(WIN32)
88+
set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES} .a;.dll)
89+
endif()
90+
91+
if(Julia_EXECUTABLE)
92+
execute_process(
93+
COMMAND ${Julia_EXECUTABLE} --startup-file=no -E "${USING_LIBDL}\nabspath(Libdl.dlpath((ccall(:jl_is_debugbuild, Cint, ()) != 0) ? \"libjulia-debug\" : \"libjulia\"))"
94+
OUTPUT_VARIABLE Julia_LIBRARY
95+
)
96+
97+
string(REGEX REPLACE "\"" "" Julia_LIBRARY "${Julia_LIBRARY}")
98+
string(REGEX REPLACE "\n" "" Julia_LIBRARY "${Julia_LIBRARY}")
99+
string(STRIP "${Julia_LIBRARY}" Julia_LIBRARY)
100+
101+
if(WIN32)
102+
get_filename_component(Julia_LIBRARY_DIR ${Julia_LIBRARY} DIRECTORY)
103+
get_filename_component(Julia_LIBRARY_DIR ${Julia_LIBRARY_DIR} DIRECTORY)
104+
find_library(win_Julia_LIBRARY
105+
NAMES libjulia.dll.a
106+
PATHS "${Julia_LIBRARY_DIR}/lib"
107+
NO_DEFAULT_PATH
108+
)
109+
set(Julia_LIBRARY "${win_Julia_LIBRARY}")
110+
endif()
111+
112+
set(Julia_LIBRARY "${Julia_LIBRARY}"
113+
CACHE PATH "Julia library")
114+
else()
115+
find_library(Julia_LIBRARY NAMES libjulia.${Julia_VERSION_STRING}.dylib julia libjulia.dll.a libjulia CMAKE_FIND_ROOT_PATH_BOTH)
116+
endif()
117+
118+
get_filename_component(Julia_LIBRARY_DIR ${Julia_LIBRARY} DIRECTORY)
119+
120+
MESSAGE(STATUS "Julia_LIBRARY_DIR: ${Julia_LIBRARY_DIR}")
121+
MESSAGE(STATUS "Julia_LIBRARY: ${Julia_LIBRARY}")
122+
123+
##############
124+
# JULIA_HOME #
125+
##############
126+
127+
if(Julia_EXECUTABLE)
128+
execute_process(
129+
COMMAND ${Julia_EXECUTABLE} --startup-file=no -E "${JULIA_HOME_NAME}"
130+
OUTPUT_VARIABLE JULIA_HOME
131+
)
132+
133+
string(REGEX REPLACE "\"" "" JULIA_HOME "${JULIA_HOME}")
134+
string(REGEX REPLACE "\n" "" JULIA_HOME "${JULIA_HOME}")
135+
136+
MESSAGE(STATUS "JULIA_HOME: ${JULIA_HOME}")
137+
138+
###################
139+
# libLLVM version #
140+
###################
141+
142+
execute_process(
143+
COMMAND ${Julia_EXECUTABLE} --startup-file=no -E "Base.libllvm_version"
144+
OUTPUT_VARIABLE Julia_LLVM_VERSION
145+
)
146+
147+
string(REGEX REPLACE "\"" "" Julia_LLVM_VERSION "${Julia_LLVM_VERSION}")
148+
string(REGEX REPLACE "\n" "" Julia_LLVM_VERSION "${Julia_LLVM_VERSION}")
149+
150+
MESSAGE(STATUS "Julia_LLVM_VERSION: ${Julia_LLVM_VERSION}")
151+
endif()
152+
153+
##################################
154+
# Check for Existence of Headers #
155+
##################################
156+
157+
find_path(Julia_MAIN_HEADER julia.h HINTS ${Julia_INCLUDE_DIRS})
158+
159+
#######################################
160+
# Determine if we are on 32 or 64 bit #
161+
#######################################
162+
163+
if(Julia_EXECUTABLE)
164+
execute_process(
165+
COMMAND ${Julia_EXECUTABLE} --startup-file=no -E "Sys.WORD_SIZE"
166+
OUTPUT_VARIABLE Julia_WORD_SIZE
167+
)
168+
string(REGEX REPLACE "\n" "" Julia_WORD_SIZE "${Julia_WORD_SIZE}")
169+
MESSAGE(STATUS "Julia_WORD_SIZE: ${Julia_WORD_SIZE}")
170+
endif()
171+
172+
if($ENV{target} MATCHES "^i686.*")
173+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse -msse2")
174+
endif()
175+
176+
###########################
177+
# FindPackage Boilerplate #
178+
###########################
179+
180+
include(FindPackageHandleStandardArgs)
181+
find_package_handle_standard_args(Julia
182+
REQUIRED_VARS Julia_LIBRARY Julia_LIBRARY_DIR Julia_INCLUDE_DIRS Julia_MAIN_HEADER
183+
VERSION_VAR Julia_VERSION_STRING
184+
FAIL_MESSAGE "Julia not found"
185+
)

0 commit comments

Comments
 (0)