Skip to content

Commit 052d0a9

Browse files
committed
Configure sync region endpoints that produce reverse barriers.
Check range of enumeration-like configuration options. Merge branch 'feature/configurableSyncRegions' into develop
2 parents d5bff47 + 47b2dd7 commit 052d0a9

4 files changed

Lines changed: 72 additions & 7 deletions

File tree

include/opdi/config.hpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@
3535
#define OPDI_ADJOINT_ACCESS_ATOMIC 1
3636
#define OPDI_ADJOINT_ACCESS_CLASSICAL 2
3737

38+
#define OPDI_SCOPE_ENDPOINT_BEGIN 1
39+
#define OPDI_SCOPE_ENDPOINT_END 2
40+
#define OPDI_SCOPE_ENDPOINT_BOTH 3
41+
3842
/* ------------------ configuration ------------------ */
3943

4044
/* logic options */
@@ -51,6 +55,46 @@
5155
#define OPDI_DEFAULT_ADJOINT_ACCESS_MODE OPDI_ADJOINT_ACCESS_ATOMIC
5256
#endif
5357

58+
static_assert(0 < OPDI_DEFAULT_ADJOINT_ACCESS_MODE);
59+
static_assert(OPDI_DEFAULT_ADJOINT_ACCESS_MODE <= 2);
60+
61+
/* sync region behaviour */
62+
63+
#ifndef OPDI_SYNC_REGION_BARRIER_BEHAVIOUR
64+
#define OPDI_SYNC_REGION_BARRIER_BEHAVIOUR OPDI_SCOPE_ENDPOINT_BEGIN
65+
#endif
66+
67+
static_assert(0 < OPDI_SYNC_REGION_BARRIER_BEHAVIOUR);
68+
static_assert(OPDI_SYNC_REGION_BARRIER_BEHAVIOUR <= 3);
69+
70+
#ifndef OPDI_SYNC_REGION_BARRIER_IMPLICIT_BEHAVIOUR
71+
#define OPDI_SYNC_REGION_BARRIER_IMPLICIT_BEHAVIOUR OPDI_SCOPE_ENDPOINT_BEGIN
72+
#endif
73+
74+
static_assert(0 < OPDI_SYNC_REGION_BARRIER_IMPLICIT_BEHAVIOUR);
75+
static_assert(OPDI_SYNC_REGION_BARRIER_IMPLICIT_BEHAVIOUR <= 3);
76+
77+
#ifndef OPDI_SYNC_REGION_BARRIER_EXPLICIT_BEHAVIOUR
78+
#define OPDI_SYNC_REGION_BARRIER_EXPLICIT_BEHAVIOUR OPDI_SCOPE_ENDPOINT_BEGIN
79+
#endif
80+
81+
static_assert(0 < OPDI_SYNC_REGION_BARRIER_EXPLICIT_BEHAVIOUR);
82+
static_assert(OPDI_SYNC_REGION_BARRIER_EXPLICIT_BEHAVIOUR <= 3);
83+
84+
#ifndef OPDI_SYNC_REGION_BARRIER_IMPLEMENTATION_BEHAVIOUR
85+
#define OPDI_SYNC_REGION_BARRIER_IMPLEMENTATION_BEHAVIOUR OPDI_SCOPE_ENDPOINT_BOTH
86+
#endif
87+
88+
static_assert(0 < OPDI_SYNC_REGION_BARRIER_IMPLEMENTATION_BEHAVIOUR);
89+
static_assert(OPDI_SYNC_REGION_BARRIER_IMPLEMENTATION_BEHAVIOUR <= 3);
90+
91+
#ifndef OPDI_SYNC_REGION_BARRIER_REVERSE_BEHAVIOUR
92+
#define OPDI_SYNC_REGION_BARRIER_REVERSE_BEHAVIOUR OPDI_SCOPE_ENDPOINT_BEGIN
93+
#endif
94+
95+
static_assert(0 < OPDI_SYNC_REGION_BARRIER_REVERSE_BEHAVIOUR);
96+
static_assert(OPDI_SYNC_REGION_BARRIER_REVERSE_BEHAVIOUR <= 3);
97+
5498
/* error handling options */
5599

56100
#ifndef OPDI_ENABLE_WARNINGS

include/opdi/logic/logicInterface.hpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,17 @@ namespace opdi {
3434
public:
3535

3636
enum MutexKind : std::size_t {
37-
Critical, Lock, NestedLock, Ordered, Reduction
37+
Critical = 0, Lock, NestedLock, Ordered, Reduction
3838
};
3939

4040
static constexpr std::size_t nMutexKind = 5;
4141

42-
enum ScopeEndpoint {
43-
Begin, End, BeginEnd
42+
enum ScopeEndpoint : std::size_t {
43+
Begin = 1, End, BeginEnd
4444
};
4545

46-
enum SyncRegionKind {
47-
Barrier, BarrierImplicit, BarrierExplicit, BarrierImplementation, BarrierReverse
46+
enum SyncRegionKind : std::size_t {
47+
Barrier = 1, BarrierImplicit, BarrierExplicit, BarrierImplementation, BarrierReverse
4848
};
4949

5050
enum WorksharingKind {

include/opdi/logic/omp/syncRegionOmpLogic.cpp

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,22 @@ void opdi::SyncRegionOmpLogic::internalPushHandle(SyncRegionKind kind, ScopeEndp
6464
tool->pushExternalFunction(tool->getThreadLocalTape(), handle);
6565
}
6666

67+
bool opdi::SyncRegionOmpLogic::requiresReverseBarrier(SyncRegionKind kind, ScopeEndpoint endpoint) {
68+
69+
static std::size_t constexpr syncRegionBehaviour[] = {
70+
OPDI_SYNC_REGION_BARRIER_BEHAVIOUR,
71+
OPDI_SYNC_REGION_BARRIER_IMPLICIT_BEHAVIOUR,
72+
OPDI_SYNC_REGION_BARRIER_EXPLICIT_BEHAVIOUR,
73+
OPDI_SYNC_REGION_BARRIER_IMPLEMENTATION_BEHAVIOUR,
74+
OPDI_SYNC_REGION_BARRIER_REVERSE_BEHAVIOUR
75+
};
76+
77+
assert(1 <= kind && kind <= 5);
78+
assert(1 == endpoint || 2 == endpoint);
79+
80+
return syncRegionBehaviour[kind - 1] & endpoint;
81+
}
82+
6783
void opdi::SyncRegionOmpLogic::onSyncRegion(SyncRegionKind kind, ScopeEndpoint endpoint) {
6884

6985
#if OPDI_OMP_LOGIC_INSTRUMENT
@@ -73,8 +89,9 @@ void opdi::SyncRegionOmpLogic::onSyncRegion(SyncRegionKind kind, ScopeEndpoint e
7389
#endif
7490

7591
if (tool->getThreadLocalTape() != nullptr && tool->isActive(tool->getThreadLocalTape())) {
76-
77-
internalPushHandle(kind, endpoint);
92+
if (requiresReverseBarrier(kind, endpoint)) {
93+
internalPushHandle(kind, endpoint);
94+
}
7895
}
7996
}
8097

include/opdi/logic/omp/syncRegionOmpLogic.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525

2626
#pragma once
2727

28+
#include "../../config.hpp"
29+
2830
#include "../logicInterface.hpp"
2931

3032
namespace opdi {
@@ -41,6 +43,8 @@ namespace opdi {
4143
ScopeEndpoint endpoint;
4244
};
4345

46+
bool requiresReverseBarrier(SyncRegionKind kind, ScopeEndpoint endpoint);
47+
4448
private:
4549

4650
static void reverseFunc(void* dataPtr);

0 commit comments

Comments
 (0)