C++ Message Queuing Library and Framework
Go to file
2023-12-13 15:31:14 +01:00
.github Update dependabot.yml 2023-12-13 15:31:14 +01:00
cmake feat: Make the channel AutoBind default configurable 2023-06-26 11:56:24 +02:00
docs feat(plugins)!: Remove PMIx plugin 2023-03-02 11:20:35 +01:00
examples shm: when refCount segment size is zero, fallback to old behaviour 2023-11-29 19:21:42 +01:00
extern build: Bump bundled GTest to @a1cc8c55 2022-08-12 01:50:14 +02:00
fairmq shm: when refCount segment size is zero, fallback to old behaviour 2023-11-29 19:21:42 +01:00
test shm: when refCount segment size is zero, fallback to old behaviour 2023-11-29 19:21:42 +01:00
.clang-format Update clang-format 2018-08-09 16:15:15 +02:00
.clang-tidy Apply modernize-pass-by-value 2021-05-28 13:14:51 +02:00
.gitignore build: Add spack develop environment 2023-03-23 14:14:08 +01:00
.gitlint ci: Configure gitlint 2021-07-07 14:43:32 +02:00
.gitmodules feat: Drop public bundled dependency to asio 2021-07-16 12:31:17 +02:00
.zenodo.json chore: Run meta_update.py 2023-08-08 16:26:10 +02:00
AUTHORS Add orcid for Alexey 2023-03-02 13:03:04 +01:00
CMakeGraphVizOptions.cmake CMake: Add config for --graphviz 2019-09-04 21:17:35 +02:00
CMakeLists.txt build: Update CMake policy version range 2023-03-02 11:20:35 +01:00
codemeta.json docs: Add "releaseNotes" field to codemeta 2023-09-11 18:07:29 +02:00
CONTRIBUTORS build: Add ORCID for Christian Tacke 2022-09-01 17:44:16 +02:00
COPYRIGHT fix: Update metadata 2022-03-21 18:22:07 +01:00
CTestConfig.cmake Remove obsolete CTest config 2021-05-28 10:38:14 +02:00
FairMQTest.cmake feat(plugins)!: Remove PMIx plugin 2023-03-02 11:20:35 +01:00
Jenkinsfile ci: Update build matrix 2023-06-26 11:56:24 +02:00
LICENSE Help github license detection again 2018-08-24 15:27:41 +02:00
meta_update.py build(metaUpdater): Keep original ordering when adding new entries 2022-09-02 20:39:41 +02:00
README.md feat: Make the channel AutoBind default configurable 2023-06-26 11:56:24 +02:00
spack.yaml build: Add spack develop environment 2023-03-23 14:14:08 +01:00

FairMQ

license DOI OpenSSF Best Practices fair-software.eu Spack package

C++ Message Queuing Library and Framework

Docs: Book

Find all FairMQ releases here.

Introduction

FairMQ is designed to help implementing large-scale data processing workflows needed in next-generation Particle Physics experiments. FairMQ is written in C++ and aims to

  • provide an asynchronous message passing abstraction of different data transport technologies,
  • provide a reasonably efficient data transport service (zero-copy, high throughput),
  • be data format agnostic, and
  • provide basic building blocks that can be used to implement higher level data processing workflows.

The core of FairMQ provides an abstract asynchronous message passing API with scalability protocols inspired by ZeroMQ (e.g. PUSH/PULL, PUB/SUB). FairMQ provides multiple implementations for its API (so-called "transports", e.g. zeromq and shmem (latest release of the ofi transport in v1.4.56, removed since v1.5+)) to cover a variety of use cases (e.g. inter-thread, inter-process, inter-node communication) and machines (e.g. Ethernet, Infiniband). In addition to this core functionality FairMQ provides a framework for creating "devices" - actors which are communicating through message passing. FairMQ does not only allow the user to use different transport but also to mix them; i.e: A Device can communicate using different transport on different channels at the same time. Device execution is modelled as a simple state machine that shapes the integration points for the user task. Devices also incorporate a plugin system for runtime configuration and control. Next to the provided devices and plugins the user can extend FairMQ by developing his own plugins to integrate his devices with external configuration and control services.

FairMQ has been developed in the context of its mother project FairRoot - a simulation, reconstruction and analysis framework.

Installation from Source

Recommended:

git clone https://github.com/FairRootGroup/FairMQ fairmq_source
cmake -S fairmq_source -B fairmq_build -GNinja -DCMAKE_BUILD_TYPE=Release
cmake --build fairmq_build
ctest --test-dir fairmq_build --output-on-failure --schedule-random -j<ncpus>
cmake --install fairmq_build --prefix $(pwd)/fairmq_install

Please consult the manpages of your CMake version for more options.

If dependencies are not installed in standard system directories, you can hint the installation location via -DCMAKE_PREFIX_PATH=... or per dependency via -D{DEPENDENCY}_ROOT=... (*_ROOT variables can also be environment variables).

Usage

FairMQ ships as a CMake package, so in your CMakeLists.txt you can discover it like this:

find_package(FairCMakeModules 1.0 REQUIRED)
include(FairFindPackage2)
find_package2(FairMQ)
find_package2_implicit_dependencies()

The FairFindPackage2 module is part of the FairCMakeModules package.

If FairMQ is not installed in system directories, you can hint the installation:

list(PREPEND CMAKE_PREFIX_PATH /path/to/fairmq_install)

Dependencies

Which dependencies are required depends on which components are built.

Supported platform is Linux. macOS is supported on a best-effort basis.

CMake options

On command line:

  • -DDISABLE_COLOR=ON disables coloured console output.
  • -DBUILD_TESTING=OFF disables building of tests.
  • -DBUILD_EXAMPLES=OFF disables building of examples.
  • -DBUILD_DOCS=ON enables building of API docs.
  • -DFAIRMQ_CHANNEL_DEFAULT_AUTOBIND=OFF disable channel autoBind by default
  • You can hint non-system installations for dependent packages, see the #installation-from-source section above

After the find_package(FairMQ) call the following CMake variables are defined:

Variable Info
${FairMQ_PACKAGE_DEPENDENCIES} the list of public package dependencies
${FairMQ_<dep>_VERSION} the minimum <dep> version FairMQ requires
${FairMQ_<dep>_COMPONENTS} the list of <dep> components FairMQ depends on
${FairMQ_PACKAGE_COMPONENTS} the list of components FairMQ consists of
${FairMQ_#COMPONENT#_FOUND} TRUE if this component was built
${FairMQ_VERSION} the version in format MAJOR.MINOR.PATCH
${FairMQ_GIT_VERSION} the version in the format returned by git describe --tags --dirty --match "v*"
${FairMQ_PREFIX} the actual installation prefix
${FairMQ_BINDIR} the installation bin directory
${FairMQ_INCDIR} the installation include directory
${FairMQ_LIBDIR} the installation lib directory
${FairMQ_DATADIR} the installation data directory (../share/fairmq)
${FairMQ_CMAKEMODDIR} the installation directory of shipped CMake find modules
${FairMQ_BUILD_TYPE} the value of CMAKE_BUILD_TYPE at build-time
${FairMQ_CXX_FLAGS} the values of CMAKE_CXX_FLAGS and CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE} at build-time

Documentation

  1. Device
    1. Topology
    2. Communication Patterns
    3. State Machine
    4. Multiple devices in the same process
  2. Transport Interface
    1. Message
      1. Ownership
    2. Channel
    3. Poller
  3. Configuration
    1. Device Configuration
    2. Communication Channels Configuration
      1. JSON Parser
      2. SuboptParser
    3. Introspection
  4. Development
    1. Testing
    2. Static Analysis
      1. CMake Integration
      2. Extra Compiler Arguments
  5. Logging
    1. Log severity
    2. Log verbosity
    3. Color for console output
    4. File output
    5. Custom sinks
  6. Examples
  7. Plugins
    1. Usage
    2. Development
    3. Provided Plugins
      1. PMIx