Update main README with up to date information

This commit is contained in:
babic_a committed 2020-07-23 13:13:44 +02:00
1 parent b55fb89ae5
commit bb681800a2
3 files changed
+92 -108

No files matched your search

+91 -107
View File
@@ -7,6 +7,97 @@ Overview of current architecture and component interaction.
Documentation of individual components:
- [sf-buffer](sf-buffer) (Receive UDP and write buffer files)
- [sf-stream](sf-stream) (Live streaming of detector data)
- [sf-writer](sf-writer) (Read from buffer and write H5)
- [sf-utils](sf-utils) (Small utilities for debugging and testing)
## Terminology
In order to unify the way we write code and talk about concept the following
terminology definitions should be followed:
- frame (data from a single module)
- image (assembled frames)
- start_pulse_id and stop_pulse_id (not end_pulse_id) is used to determine the
inclusive range (both start and stop pulse_id are included) of pulses.
- pulse_id_step (how many pulses to skip between each image).
- GPFS buffer (on GPFS detector buffering mechanism based on binary files)
- detector_folder (root folder of the buffer for a specific detector on disk)
- module_folder (folder of one module inside the detector_folder)
- data_folder (folder where we group more buffer files based on pulse_id range)
- data_file (the files where the actual data is stored, inside data_folder)
## Design goals
- Simplest thing that works.
- Save time and iterate more quickly.
- Less moving parts, less problems.
- Start optimizing only when things break.
- Many optimization possibilities, but not for now.
- Makes possible to test technologies faster.
- Small debuggable and profileable processes.
- Needs to be able to run on your local machine in a debugger.
- Asses code performance without guessing.
- As little dependency between processes as possible.
- Run only the process you want to test.
- Write unit tests.
## Build
To compile this repo you will need to install the following packages on RH7:
- devtoolset-9
- cmake3
- zeromq-devel
- hdf5-devel
```bash
yum install devtoolset-9
yum install cmake3
yum install zeromq-devel
yum install hdf5-devel
```
Step by step procedure to build the repo:
```bash
scl enable devtoolset-9 bash
git clone https://github.com/paulscherrerinstitute/sf_daq_buffer.git
cd sf_daq_buffer
mkdir build
cd build/
cmake3 ..
make
```
It is recommended to create symbolic links to the executables you will be using
inside your PATH.
Example:
```bash
ln -s "$(pwd)""/""sf_buffer" /usr/bin/sf_buffer
ln -s "$(pwd)""/""sf_stream" /usr/bin/sf_stream
ln -s "$(pwd)""/""sf_writer" /usr/bin/sf_writer
```
### Warnings
#### Zeromq
Zeromq version 4.1.4 (default on RH7) has a LINGER bug. Sometimes, the last
message is not sent (the connection gets dropped before the message is in the buffer).
Since we use PUSH/PULL only in sf-stream at the moment, this is not critical anymore.
But in the future we might use the PUSH/PULL mechanism, so updating to the latest
version of ZMQ should help us prevent future bug hunting sessions.
Please install a later version:
```bash
cd /etc/yum.repos.d/
wget https://download.opensuse.org/repositories/network:messaging:zeromq:release-stable/RHEL_7/network:messaging:zeromq:release-stable.repo
yum remove zeromq
yum remove openpgm
yum install libsodium-devel
yum install zeromq-devel
```
## Useful links
@@ -77,110 +168,3 @@ https://community.mellanox.com/s/article/raw-ethernet-programming--basic-introdu
- Performance Tuning for Mellanox Adapters
https://community.mellanox.com/s/article/performance-tuning-for-mellanox-adapters
- UEFI Workload-based Performance and TuningGuide for HPE ProLiant Gen10 https://support.hpe.com/hpesc/public/docDisplay?docId=a00016408en_us
## Build
To compile this repo you will need to install the following packages on RH7:
- devtoolset-9
- cmake3
- zeromq-devel
- hdf5-devel
```bash
yum install devtoolset-9
yum install cmake3
yum install zeromq-devel
yum install hdf5-devel
```
Step by step procedure to build the repo:
```bash
scl enable devtoolset-9 bash
git clone https://github.com/paulscherrerinstitute/sf_daq_buffer.git
cd sf_daq_buffer
mkdir build
cd build/
cmake3 ..
make
```
It is recommended to create symbolic links to the executables you will be using
inside your PATH.
Example:
```bash
ln -s "$(pwd)""/""sf_buffer" /usr/bin/sf_buffer
ln -s "$(pwd)""/""sf_stream" /usr/bin/sf_stream
ln -s "$(pwd)""/""sf_writer" /usr/bin/sf_writer
```
### Warnings
#### Zeromq
Zeromq version 4.1.4 (default on RH7) has a LINGER bug. Sometimes, the last
message is not sent (the connection gets dropped before the message is in the buffer).
Since we use PUSH/PULL to modulate the sf_replay speed, this is a key functionality we are using.
Please install a later version:
```bash
cd /etc/yum.repos.d/
wget https://download.opensuse.org/repositories/network:messaging:zeromq:release-stable/RHEL_7/network:messaging:zeromq:release-stable.repo
yum remove zeromq
yum remove openpgm
yum install libsodium-devel
yum install zeromq-devel
```
## Terminology
In order to unify the way we write code and talk about concept the following
terminology definitions should be followed:
- frame (data from a single module)
- image (data of the assembled image)
- start_pulse_id and stop_pulse_id (not end_pulse_id) is used to determine the
inclusive range (both start and stop pulse_id are included) of pulses.
- pulse_id_step (how many pulses to skip between images).
- detector_folder (root folder of the buffer for a specific detector on disk)
- module_name (name of one module inside the detector_folder)
- data_folder (folder where we group more buffer files based on pulse_id range)
## Data request ranges
Data request ranges are composed of:
- start_pulse_id (first pulse_id to be included in the file)
- stop_pulse_id (last pulse_id to be included in the file)
- pulse_id_step (how many pulses to skip between images.)
pulse_id_step can be used to write data at different frequencies:
- pulse_id_step == 1 (100Hz, write very pulse_id)
- pulse_id_step == 2 (50hz, write every second pulse)
- pulse_id_step == 10 (10Hz, write every 10th pulse)
The next pulse_id to be written is calculated internally as:
```c++
auto next_pulse_id = currnet_pulse_id + pulse_id_step;
```
The loop criteria for writing is:
```c++
for (
auto curr_pulse_id = start_pulse_id;
curr_pulse_id <= stop_pulse_id;
curr_pulse_id += pulse_id_step
) {
// Write curr_pulse_id to output file.
}
```
**Warning**
If your stop_pulse_id cannot be reached by adding step_pulse_id to
start_pulse_id (start_pulse_id + (n * pulse_id_step) != stop_pulse_id for any n)
it will not be included in the final file.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 KiB

After

Width:  |  Height:  |  Size: 150 KiB

+1 -1
View File
@@ -1 +1 @@
<mxfile host="Electron" modified="2020-07-23T10:35:52.572Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/12.9.9 Chrome/80.0.3987.163 Electron/8.2.1 Safari/537.36" etag="gsGa6As5K3yZB7anSgQV" version="12.9.9" type="device" pages="6"><diagram name="overview" id="muXDs5UsbG9aPfefTxRP">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</diagram><diagram name="sf_buffer" id="McOcRQAG4h0-hEUw4Ais">7VxbV+o6EP41POLqveVRQNB9cONls9j64krbFKqlqW0ql19/kl6gl4BViqJul0vaSZom33yTzEyCDbEzW/R94E0vkQmdhsCZi4bYbQiC0BJ58Line truncated
<mxfile host="Electron" modified="2020-07-23T11:13:06.126Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/12.9.9 Chrome/80.0.3987.163 Electron/8.2.1 Safari/537.36" etag="ZhQh4hxJy49bxhFi3KBG" version="12.9.9" type="device" pages="6"><diagram name="overview" id="muXDs5UsbG9aPfefTxRP">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</diagram><diagram name="sf_buffer" id="McOcRQAG4h0-hEUw4Ais">7VxbV+o6EP41POLqveVRQNB9cONls9j64krbFKqlqW0ql19/kl6gl4BViqJul0vaSZom33yTzEyCDbEzW/R94E0vkQmdhsCZi4bYbQiC0BJ58kEly1jCq0Iimfi2mcg2glt7BRMhl0hD24RBLEtEGCEH215eaCDXhQbOyYDvo3mQe4mFnPxbPTCBJcGtAZyydGybeJpIFY7bFJxDezJNXt1KC2YgrZwIgikw0TwjEs8aYsdHCMdXs0UHOhS9FJeLpvww/HU5aN47wt35cHDjzfVm3FjvLY+sh+BDF7+76em9Gli+a92u7vq/HvU/A+DjtOkX4IQJXslY8TIF0Eeha0LaCNcQ2/OpjeGtBwxaOiecILine truncated