2.3.3.5. Dependence managers¶
Nanos++ provides several plugins to handle task dependencies, with different performance and features.
2.3.3.5.1. Usage¶
NX_DEPS=<string>
--deps[ |=]<string>
2.3.3.5.2. List of dependence plugins¶
2.3.3.5.2.1. Plain¶
Important
This is the default dependence plugin
- Configuration string:
NX_DEPS=plain
orNX_ARGS="--deps=plain"
- Description: This plugin uses single memory addresses to compute dependences. In most of the cases the programmer can use a single memory point as a sentinel for a whole region.
2.3.3.5.2.2. Regions¶
- Configuration string:
NX_DEPS=regions
orNX_ARGS="--deps=regions"
- Description: This plugin does not partition regions. It is more suitable for task with halos.
2.3.3.5.2.3. Perfect-regions¶
- Configuration string:
NX_DEPS=perfect-regions
orNX_ARSG="--deps=perfect-regions"
- Description: Partitions regions into perfect regions. It is recommended for applications like multisort.
2.3.3.5.2.4. Contiguous regions¶
Important
This is a test and functional plugin, so it’s performance may not be the best
- Configuration string:
NX_DEPS=cregions
orNX_ARSG="--deps=cregions"
- Description: Detects dependencies between regions defined by start address and end address.
2.3.3.5.2.5. Contiguous regions nocache¶
Important
This is a test and functional plugin, so it’s performance may not be the best
- Configuration string:
NX_DEPS=cregions_nocache
orNX_ARSG="--deps=cregions_nocache"
- Description: Similar to Contiguous regions but small regions go to a dedicated structure (performance may be better in some applications).
2.3.3.5.3. Dependence management examples¶
The default plugin is called plain, and it can only handle simple dependencies that do not overlap. The following is allowed:
#pragma omp task inout( [NB]block )
task_1();
#pragma omp task inout( [NB]block )
task_2();
#pragma omp task inout( block[0;NB] )
task_3();
The following requires regions support, as provided by the regions and perfect-regions plugins:
#pragma omp task inout( block[0;3] )
task_4();
#pragma omp task inout( block[1;3] )
task_5();
Here task 5 will not depend on task 4 when using the plain plugin.
Regions are also required when you have non-contiguous memory, such as matrices. Although regions are much more powerful, there is a drawback with the current regions plugins: alignment. Keep in mind that if your data is not properly aligned, there will be a potential task serialisation and therefore a huge performance toll.