gpu-compute: Changing reconvergenceStack type

std::stack has no iterators, therefore the reconvergence stack can't be
iterated without poping elements off. We will be using std::list instead to be
able to iterate for saving and restoring purposes.
This commit is contained in:
Alexandru Dutu 2016-09-16 12:29:01 -04:00
parent d5c8c5d3db
commit 7918376450
2 changed files with 29 additions and 36 deletions

View file

@ -873,7 +873,7 @@ Wavefront::pushToReconvergenceStack(uint32_t pc, uint32_t rpc,
const VectorMask& mask) const VectorMask& mask)
{ {
assert(mask.count()); assert(mask.count());
reconvergenceStack.emplace(new ReconvergenceStackEntry(pc, rpc, mask)); reconvergenceStack.emplace_back(new ReconvergenceStackEntry{pc, rpc, mask});
} }
void void
@ -886,7 +886,7 @@ Wavefront::popFromReconvergenceStack()
execMask().to_string<char, std::string::traits_type, execMask().to_string<char, std::string::traits_type,
std::string::allocator_type>().c_str(), pc()); std::string::allocator_type>().c_str(), pc());
reconvergenceStack.pop(); reconvergenceStack.pop_back();
DPRINTF(WavefrontStack, "%3i %s\n", pc(), DPRINTF(WavefrontStack, "%3i %s\n", pc(),
execMask().to_string<char, std::string::traits_type, execMask().to_string<char, std::string::traits_type,
@ -904,32 +904,32 @@ Wavefront::discardFetch()
uint32_t uint32_t
Wavefront::pc() const Wavefront::pc() const
{ {
return reconvergenceStack.top()->pc; return reconvergenceStack.back()->pc;
} }
uint32_t uint32_t
Wavefront::rpc() const Wavefront::rpc() const
{ {
return reconvergenceStack.top()->rpc; return reconvergenceStack.back()->rpc;
} }
VectorMask VectorMask
Wavefront::execMask() const Wavefront::execMask() const
{ {
return reconvergenceStack.top()->execMask; return reconvergenceStack.back()->execMask;
} }
bool bool
Wavefront::execMask(int lane) const Wavefront::execMask(int lane) const
{ {
return reconvergenceStack.top()->execMask[lane]; return reconvergenceStack.back()->execMask[lane];
} }
void void
Wavefront::pc(uint32_t new_pc) Wavefront::pc(uint32_t new_pc)
{ {
reconvergenceStack.top()->pc = new_pc; reconvergenceStack.back()->pc = new_pc;
} }
uint32_t uint32_t

View file

@ -52,6 +52,27 @@
static const int MAX_NUM_INSTS_PER_WF = 12; static const int MAX_NUM_INSTS_PER_WF = 12;
/**
* A reconvergence stack entry conveys the necessary state to implement
* control flow divergence.
*/
struct ReconvergenceStackEntry {
/**
* PC of current instruction.
*/
uint32_t pc;
/**
* PC of the immediate post-dominator instruction, i.e., the value of
* @a pc for the first instruction that will be executed by the wavefront
* when a reconvergence point is reached.
*/
uint32_t rpc;
/**
* Execution mask.
*/
VectorMask execMask;
};
/* /*
* Arguments for the hsail opcode call, are user defined and variable length. * Arguments for the hsail opcode call, are user defined and variable length.
* The hardware/finalizer can support arguments in hardware or use memory to * The hardware/finalizer can support arguments in hardware or use memory to
@ -120,34 +141,6 @@ class CallArgMem
} }
}; };
/**
* A reconvergence stack entry conveys the necessary state to implement
* control flow divergence.
*/
class ReconvergenceStackEntry {
public:
ReconvergenceStackEntry(uint32_t new_pc, uint32_t new_rpc,
VectorMask new_mask) : pc(new_pc), rpc(new_rpc),
execMask(new_mask) {
}
/**
* PC of current instruction.
*/
uint32_t pc;
/**
* PC of the immediate post-dominator instruction, i.e., the value of
* @a pc for the first instruction that will be executed by the wavefront
* when a reconvergence point is reached.
*/
uint32_t rpc;
/**
* Execution mask.
*/
VectorMask execMask;
};
class Wavefront : public SimObject class Wavefront : public SimObject
{ {
public: public:
@ -368,7 +361,7 @@ class Wavefront : public SimObject
* point (branch instruction), and shrinks every time the wavefront * point (branch instruction), and shrinks every time the wavefront
* reaches a reconvergence point (immediate post-dominator instruction). * reaches a reconvergence point (immediate post-dominator instruction).
*/ */
std::stack<std::unique_ptr<ReconvergenceStackEntry>> reconvergenceStack; std::deque<std::unique_ptr<ReconvergenceStackEntry>> reconvergenceStack;
}; };
#endif // __WAVEFRONT_HH__ #endif // __WAVEFRONT_HH__