From a788ea6aa40763ee95bc383c52fb699c3eae22a8 Mon Sep 17 00:00:00 2001 From: cdkersey Date: Tue, 4 Aug 2015 12:55:47 -0600 Subject: [PATCH] Barrier instruction support. --- src/enc.cpp | 10 +++++++++- src/include/core.h | 3 +++ src/include/instruction.h | 2 +- src/instruction.cpp | 23 +++++++++++++++++++++++ 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/enc.cpp b/src/enc.cpp index 946981c3..45e90a47 100644 --- a/src/enc.cpp +++ b/src/enc.cpp @@ -164,7 +164,11 @@ Instruction *ByteDecoder::decode(const vector &v, Size &n) { inst.setDestPReg(readByte(v, n)); inst.setSrcPReg(readByte(v, n)); break; - default: + case Instruction::AC_2REGSRC: + inst.setSrcReg(readByte(v, n)); + inst.setSrcReg(readByte(v, n)); + break; + default: decodeError("Unknown argument class."); } @@ -331,6 +335,10 @@ Instruction *WordDecoder::decode(const std::vector &v, Size &idx) { inst.setSrcPReg((code>>i3)&pMask); inst.setSrcPReg((code>>(i3-r))&pMask); break; + case Instruction::AC_2REGSRC: + inst.setSrcReg((code>>i2)&rMask); + inst.setSrcReg((code>>i3)&rMask); + break; defualt: cout << "Unrecognized argument class in word decoder.\n"; exit(1); diff --git a/src/include/core.h b/src/include/core.h index a0416c72..4f4b50dc 100644 --- a/src/include/core.h +++ b/src/include/core.h @@ -7,6 +7,8 @@ #include #include #include +#include +#include #include "types.h" #include "archdef.h" @@ -84,6 +86,7 @@ namespace Harp { Word interruptEntry; std::vector w; + std::map > b; // Barriers }; class Warp { diff --git a/src/include/instruction.h b/src/include/instruction.h index 26b5725f..8af44834 100644 --- a/src/include/instruction.h +++ b/src/include/instruction.h @@ -31,7 +31,7 @@ namespace Harp { JMPRT, LD, ST, LDI, RTOP, ANDP, ORP, XORP, NOTP, ISNEG, ISZERO, HALT, TRAP, JMPRU, SKEP, RETI, TLBRM, ITOF, FTOI, FADD, FSUB, FMUL, FDIV, FNEG, WSPAWN, - SPLIT, JOIN }; + SPLIT, JOIN, BAR }; enum ArgClass { AC_NONE, AC_2REG, AC_2IMM, AC_3REG, AC_3PREG, AC_3IMM, AC_3REGSRC, AC_1IMM, AC_1REG, AC_3IMMSRC, AC_PREG_REG, AC_2PREG, AC_2REGSRC diff --git a/src/instruction.cpp b/src/instruction.cpp index 47f86907..19921b48 100644 --- a/src/instruction.cpp +++ b/src/instruction.cpp @@ -360,6 +360,29 @@ void Instruction::executeOn(Warp &c) { } } break; + case BAR: if (sjOnce) { + sjOnce = false; + Word id(reg[rsrc[0]]), n(reg[rsrc[1]]); + set &b(c.core->b[id]); + + // Add current warp to the barrier and halt. + b.insert(&c); + c.shadowActiveThreads = c.activeThreads; + nextActiveThreads = 0; + + D(2, "Barrier " << id << ' ' << b.size() << " of " << n); + + // If the barrier's full, reactivate warps waiting at it + if (b.size() == n) { + set::iterator it; + for (it = b.begin(); it != b.end(); ++it) + (*it)->activeThreads = (*it)->shadowActiveThreads; + c.core->b.erase(id); + nextActiveThreads = c.shadowActiveThreads; + } + } + break; + default: cout << "ERROR: Unsupported instruction: " << *this << "\n"; exit(1);