Hello Nikos Nikoleris,
I'd like you to do a code review. Please visit
https://gem5-review.googlesource.com/c/public/gem5/+/23565
to review the following change.
Change subject: gpu: base: Move gpu AtomicOpFunctor into the generic header
......................................................................
gpu: base: Move gpu AtomicOpFunctor into the generic header
Change-Id: I10d8aeaae83c232141ddd2fd21ee43bed8712539
Signed-off-by: Giacomo Travaglini <[email protected]>
Reviewed-by: Nikos Nikoleris <[email protected]>
---
M src/base/amo.hh
M src/gpu-compute/gpu_dyn_inst.hh
2 files changed, 113 insertions(+), 111 deletions(-)
diff --git a/src/base/amo.hh b/src/base/amo.hh
index 624c755..1e1d192 100644
--- a/src/base/amo.hh
+++ b/src/base/amo.hh
@@ -109,6 +109,118 @@
std::function<void(T*, std::array<T, 2>&, std::array<T, 2>)> op;
};
+template<typename T>
+class AtomicOpAnd : public TypedAtomicOpFunctor<T>
+{
+ public:
+ T a;
+ AtomicOpAnd(T _a) : a(_a) { }
+ void execute(T *b) { *b &= a; }
+ AtomicOpFunctor* clone () { return new AtomicOpAnd(a); }
+};
+
+template<typename T>
+class AtomicOpOr : public TypedAtomicOpFunctor<T>
+{
+ public:
+ T a;
+ AtomicOpOr(T _a) : a(_a) { }
+ void execute(T *b) { *b |= a; }
+ AtomicOpFunctor* clone () { return new AtomicOpOr(a); }
+};
+
+template<typename T>
+class AtomicOpXor : public TypedAtomicOpFunctor<T>
+{
+ public:
+ T a;
+ AtomicOpXor(T _a) : a(_a) {}
+ void execute(T *b) { *b ^= a; }
+ AtomicOpFunctor* clone () { return new AtomicOpXor(a); }
+};
+
+template<typename T>
+class AtomicOpExch : public TypedAtomicOpFunctor<T>
+{
+ public:
+ T a;
+ AtomicOpExch(T _a) : a(_a) { }
+ void execute(T *b) { *b = a; }
+ AtomicOpFunctor* clone () { return new AtomicOpExch(a); }
+};
+
+template<typename T>
+class AtomicOpAdd : public TypedAtomicOpFunctor<T>
+{
+ public:
+ T a;
+ AtomicOpAdd(T _a) : a(_a) { }
+ void execute(T *b) { *b += a; }
+ AtomicOpFunctor* clone () { return new AtomicOpAdd(a); }
+};
+
+template<typename T>
+class AtomicOpSub : public TypedAtomicOpFunctor<T>
+{
+ public:
+ T a;
+ AtomicOpSub(T _a) : a(_a) { }
+ void execute(T *b) { *b -= a; }
+ AtomicOpFunctor* clone () { return new AtomicOpSub(a); }
+};
+
+template<typename T>
+class AtomicOpInc : public TypedAtomicOpFunctor<T>
+{
+ public:
+ T a;
+ AtomicOpInc() { }
+ void execute(T *b) { *b += 1; }
+ AtomicOpFunctor* clone () { return new AtomicOpInc(); }
+};
+
+template<typename T>
+class AtomicOpDec : public TypedAtomicOpFunctor<T>
+{
+ public:
+ T a;
+ AtomicOpDec() {}
+ void execute(T *b) { *b -= 1; }
+ AtomicOpFunctor* clone () { return new AtomicOpDec(); }
+};
+
+template<typename T>
+class AtomicOpMax : public TypedAtomicOpFunctor<T>
+{
+ public:
+ T a;
+ AtomicOpMax(T _a) : a(_a) { }
+
+ void
+ execute(T *b)
+ {
+ if (a > *b)
+ *b = a;
+ }
+ AtomicOpFunctor* clone () { return new AtomicOpMax(a); }
+};
+
+template<typename T>
+class AtomicOpMin : public TypedAtomicOpFunctor<T>
+{
+ public:
+ T a;
+ AtomicOpMin(T _a) : a(_a) {}
+
+ void
+ execute(T *b)
+ {
+ if (a < *b)
+ *b = a;
+ }
+ AtomicOpFunctor* clone () { return new AtomicOpMin(a); }
+};
+
typedef std::unique_ptr<AtomicOpFunctor> AtomicOpFunctorPtr;
#endif // __BASE_AMO_HH__
diff --git a/src/gpu-compute/gpu_dyn_inst.hh
b/src/gpu-compute/gpu_dyn_inst.hh
index 9e63c44..1f7bb65 100644
--- a/src/gpu-compute/gpu_dyn_inst.hh
+++ b/src/gpu-compute/gpu_dyn_inst.hh
@@ -39,6 +39,7 @@
#include <cstdint>
#include <string>
+#include "base/amo.hh"
#include "base/logging.hh"
#include "enums/MemType.hh"
#include "enums/StorageClassType.hh"
@@ -48,37 +49,6 @@
class GPUStaticInst;
template<typename T>
-class AtomicOpAnd : public TypedAtomicOpFunctor<T>
-{
- public:
- T a;
-
- AtomicOpAnd(T _a) : a(_a) { }
- void execute(T *b) { *b &= a; }
- AtomicOpFunctor* clone () { return new AtomicOpAnd(a); }
-};
-
-template<typename T>
-class AtomicOpOr : public TypedAtomicOpFunctor<T>
-{
- public:
- T a;
- AtomicOpOr(T _a) : a(_a) { }
- void execute(T *b) { *b |= a; }
- AtomicOpFunctor* clone () { return new AtomicOpOr(a); }
-};
-
-template<typename T>
-class AtomicOpXor : public TypedAtomicOpFunctor<T>
-{
- public:
- T a;
- AtomicOpXor(T _a) : a(_a) {}
- void execute(T *b) { *b ^= a; }
- AtomicOpFunctor* clone () { return new AtomicOpXor(a); }
-};
-
-template<typename T>
class AtomicOpCAS : public TypedAtomicOpFunctor<T>
{
public:
@@ -108,86 +78,6 @@
AtomicOpFunctor* clone () { return new AtomicOpCAS(c, s, computeUnit);
}
};
-template<typename T>
-class AtomicOpExch : public TypedAtomicOpFunctor<T>
-{
- public:
- T a;
- AtomicOpExch(T _a) : a(_a) { }
- void execute(T *b) { *b = a; }
- AtomicOpFunctor* clone () { return new AtomicOpExch(a); }
-};
-
-template<typename T>
-class AtomicOpAdd : public TypedAtomicOpFunctor<T>
-{
- public:
- T a;
- AtomicOpAdd(T _a) : a(_a) { }
- void execute(T *b) { *b += a; }
- AtomicOpFunctor* clone () { return new AtomicOpAdd(a); }
-};
-
-template<typename T>
-class AtomicOpSub : public TypedAtomicOpFunctor<T>
-{
- public:
- T a;
- AtomicOpSub(T _a) : a(_a) { }
- void execute(T *b) { *b -= a; }
- AtomicOpFunctor* clone () { return new AtomicOpSub(a); }
-};
-
-template<typename T>
-class AtomicOpInc : public TypedAtomicOpFunctor<T>
-{
- public:
- AtomicOpInc() { }
- void execute(T *b) { *b += 1; }
- AtomicOpFunctor* clone () { return new AtomicOpInc(); }
-};
-
-template<typename T>
-class AtomicOpDec : public TypedAtomicOpFunctor<T>
-{
- public:
- AtomicOpDec() {}
- void execute(T *b) { *b -= 1; }
- AtomicOpFunctor* clone () { return new AtomicOpDec(); }
-};
-
-template<typename T>
-class AtomicOpMax : public TypedAtomicOpFunctor<T>
-{
- public:
- T a;
- AtomicOpMax(T _a) : a(_a) { }
-
- void
- execute(T *b)
- {
- if (a > *b)
- *b = a;
- }
- AtomicOpFunctor* clone () { return new AtomicOpMax(a); }
-};
-
-template<typename T>
-class AtomicOpMin : public TypedAtomicOpFunctor<T>
-{
- public:
- T a;
- AtomicOpMin(T _a) : a(_a) {}
-
- void
- execute(T *b)
- {
- if (a < *b)
- *b = a;
- }
- AtomicOpFunctor* clone () { return new AtomicOpMin(a); }
-};
-
typedef enum
{
VT_32,
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/23565
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: master
Gerrit-Change-Id: I10d8aeaae83c232141ddd2fd21ee43bed8712539
Gerrit-Change-Number: 23565
Gerrit-PatchSet: 1
Gerrit-Owner: Giacomo Travaglini <[email protected]>
Gerrit-Reviewer: Nikos Nikoleris <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev