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:
parent
d5c8c5d3db
commit
7918376450
2 changed files with 29 additions and 36 deletions
|
@ -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
|
||||||
|
|
|
@ -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__
|
||||||
|
|
Loading…
Reference in a new issue