Conditional compilation of eventify
This commit is contained in:
parent
3473ce65ee
commit
b83b868e33
14
Makefile
14
Makefile
|
@ -1,12 +1,18 @@
|
||||||
CXX ?= g++
|
CXX ?= g++
|
||||||
OPTFLAGS ?= -O3 -march=native
|
OPTFLAGS ?= -O3 -march=native
|
||||||
|
|
||||||
VECTOR_SIZE ?= 268435456
|
VECTOR_SIZE ?= 268435456
|
||||||
CPPFLAGS = -DVECTOR_SIZE=$(VECTOR_SIZE)
|
ENABLE_EVENTIFY ?= YES
|
||||||
INCLUDES = -I./include -I$(EVENTIFY_ROOT)/include
|
|
||||||
|
|
||||||
|
CPPFLAGS = -DVECTOR_SIZE=$(VECTOR_SIZE)
|
||||||
|
INCLUDES = -I./include
|
||||||
CXXFLAGS = $(CPPFLAGS) -std=c++20 -fopenmp $(INCLUDES) $(OPTFLAGS)
|
CXXFLAGS = $(CPPFLAGS) -std=c++20 -fopenmp $(INCLUDES) $(OPTFLAGS)
|
||||||
LDFLAGS = -fopenmp -L$(EVENTIFY_ROOT)/lib -leventify
|
LDFLAGS = -fopenmp
|
||||||
|
|
||||||
|
ifeq ($(ENABLE_EVENTIFY), "YES")
|
||||||
|
CPPFLAGS += -DENABLE_EVENTIFY
|
||||||
|
INCLUDES += -I$(EVENTIFY_ROOT)/include
|
||||||
|
LDFLAGS += -L$(EVENTIFY_ROOT)/lib -leventify
|
||||||
|
endif
|
||||||
|
|
||||||
SRC_DIR = src
|
SRC_DIR = src
|
||||||
INCLUDE_DIR = include
|
INCLUDE_DIR = include
|
||||||
|
|
16
README.md
16
README.md
|
@ -35,12 +35,10 @@ You may as well contact the author Patrick Lipka (patrick.lipka@sipearl.com).
|
||||||
|
|
||||||
- C++20 or higher
|
- C++20 or higher
|
||||||
- OpenMP support (for OpenMP parallelization strategy)
|
- OpenMP support (for OpenMP parallelization strategy)
|
||||||
- Eventify library (for Eventify parallelization strategy)
|
|
||||||
- Limitation: Providing installs for all implemented parallelization strategies is mandantory at this point. Selective compilation of strategies might be added later if needed.
|
|
||||||
|
|
||||||
### Dependencies:
|
### Dependencies:
|
||||||
|
|
||||||
- **Eventify**: Ensure that the Eventify library is properly installed and the environment variable `EVENTIFY_ROOT` points to the root directory of the Eventify installation.
|
- **Eventify**: If you want to compiler with eventify (`ENABLE_EVENTIFY=YES`), ensure that the eventify library is properly installed and the environment variable `EVENTIFY_ROOT` points to the root directory of the Eventify installation.
|
||||||
|
|
||||||
## Building the Project
|
## Building the Project
|
||||||
|
|
||||||
|
@ -50,7 +48,13 @@ To build the project, run:
|
||||||
make
|
make
|
||||||
```
|
```
|
||||||
|
|
||||||
This will compile the source files and generate an executable called `benchmark` in the `bin/` directory.
|
The default is to compile with eventify enabled `ENABLE_EVENTIFY=YES`. If you want to build without eventify, please done
|
||||||
|
|
||||||
|
```
|
||||||
|
ENABLE_EVENTIFY=NO make
|
||||||
|
```
|
||||||
|
|
||||||
|
The make command will compile the source files and generate an executable called `benchmark` in the `bin/` directory.
|
||||||
Similar to the STREAM benchmark´s Makefile, the vector sizes are defined by the preprocessor variable `VECTOR_SIZE` that can be set in the Makefile.
|
Similar to the STREAM benchmark´s Makefile, the vector sizes are defined by the preprocessor variable `VECTOR_SIZE` that can be set in the Makefile.
|
||||||
|
|
||||||
### Clean Up
|
### Clean Up
|
||||||
|
@ -158,11 +162,11 @@ To add a new kernel to the project, follow these steps:
|
||||||
|
|
||||||
- Kernels must be registered with a **name** (e.g., `"vector_product"`) and should include the corresponding **allocations and data initialization** (`prepare`) and **kernel logic** (`execute`).
|
- Kernels must be registered with a **name** (e.g., `"vector_product"`) and should include the corresponding **allocations and data initialization** (`prepare`) and **kernel logic** (`execute`).
|
||||||
- Kernels must consist out of an outer loop at least for now.
|
- Kernels must consist out of an outer loop at least for now.
|
||||||
- The kernel’s execution should be parallelizable using all of the available strategies (`omp` (OpenMP) and `eventify` (Eventify) for now). You can add more strategies by extending the `strategy` namespace.
|
- The kernel’s execution should be parallelizable using all of the available strategies (`omp` (OpenMP) and `eventify` (eventify tasking library) for now). You can add more strategies by extending the `strategy` namespace.
|
||||||
- The `VECTOR_SIZE` preprocessor variable defines the size of the input data and should be appropriate for the kernel you are implementing.
|
- The `VECTOR_SIZE` preprocessor variable defines the size of the input data and should be appropriate for the kernel you are implementing.
|
||||||
|
|
||||||
## Known Isuues and Limitations
|
## Known Isuues and Limitations
|
||||||
- The instantiation of Eventify's `task_system` is inckluded in the kernel timing, leading to a constant overhead compared to OpenMP. On NVIDIA Grace, this is 2.8 ms. It's ongoning discussion whether to include it or not.
|
- The instantiation of eventify's `task_system` is inckluded in the kernel timing, leading to a constant overhead compared to OpenMP. On NVIDIA Grace, this is 2.8 ms. It's ongoning discussion whether to include it or not.
|
||||||
|
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
|
@ -2,11 +2,13 @@
|
||||||
#define STRATEGY_HPP
|
#define STRATEGY_HPP
|
||||||
|
|
||||||
#include <omp.h>
|
#include <omp.h>
|
||||||
|
|
||||||
#include <eventify/task_system.hxx>
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#ifdef ENABLE_EVENTIFY
|
||||||
|
#include <eventify/task_system.hxx>
|
||||||
|
#endif
|
||||||
|
|
||||||
// Parallelization strategies are defined here. Assumption for now: there is
|
// Parallelization strategies are defined here. Assumption for now: there is
|
||||||
// always an outer loop than can be parallelized. The strategies are templates
|
// always an outer loop than can be parallelized. The strategies are templates
|
||||||
// instanciated when adding kernels to the kernel registry.
|
// instanciated when adding kernels to the kernel registry.
|
||||||
|
@ -35,6 +37,7 @@ void openmp_strategy(int kernel_start_idx, int kernel_end_idx, int n_threads,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ENABLE_EVENTIFY
|
||||||
// for eventify, we calculate indices for evenly divided chunks of the outermost
|
// for eventify, we calculate indices for evenly divided chunks of the outermost
|
||||||
// loop, create independent tasks and submit them to the tasking system
|
// loop, create independent tasks and submit them to the tasking system
|
||||||
template <typename Func>
|
template <typename Func>
|
||||||
|
@ -59,7 +62,8 @@ void eventify_strategy(int kernel_start_idx, int kernel_end_idx, int n_tasks,
|
||||||
task_system.submit(task);
|
task_system.submit(task);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif //ENABLE_EVENTIFY
|
||||||
|
|
||||||
// parallelization strategy selector
|
// parallelization strategy selector
|
||||||
template <typename Func>
|
template <typename Func>
|
||||||
requires invocable_with_int<Func>
|
requires invocable_with_int<Func>
|
||||||
|
@ -69,9 +73,11 @@ void execute_strategy(const std::string& strategy_name, int kernel_start_idx,
|
||||||
if (strategy_name == "omp") {
|
if (strategy_name == "omp") {
|
||||||
openmp_strategy(kernel_start_idx, kernel_end_idx, num_threads_or_tasks,
|
openmp_strategy(kernel_start_idx, kernel_end_idx, num_threads_or_tasks,
|
||||||
std::forward<Func>(loop_body));
|
std::forward<Func>(loop_body));
|
||||||
|
#ifdef ENABLE_EVENTIFY
|
||||||
} else if (strategy_name == "eventify") {
|
} else if (strategy_name == "eventify") {
|
||||||
eventify_strategy(kernel_start_idx, kernel_end_idx, num_threads_or_tasks,
|
eventify_strategy(kernel_start_idx, kernel_end_idx, num_threads_or_tasks,
|
||||||
std::forward<Func>(loop_body));
|
std::forward<Func>(loop_body));
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
throw std::invalid_argument("Unknown strategy: " + strategy_name);
|
throw std::invalid_argument("Unknown strategy: " + strategy_name);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue