summaryrefslogtreecommitdiff
path: root/src/abstract_hardware_model.h
diff options
context:
space:
mode:
authorTor Aamodt <[email protected]>2010-12-28 14:09:12 -0800
committerTor Aamodt <[email protected]>2010-12-28 14:09:12 -0800
commite7b3dd442fceb30eaa8008d97429a1d33dad2044 (patch)
tree3f1a9da5de24518bc9859283d46e8e83614e668c /src/abstract_hardware_model.h
parentd864c51b9fee6b2808e4752a556d6de4ba376b7c (diff)
- Checkpointing new support for concurrent kernel execution (CUDA only, not OpenCL)
This changelist adds full support for streams supported by a new class, stream_manager and enables concurrent execution of kernels from different streams. - fast_regression.sh fails for simpleMultiCopy, simpleStreams (other tests passing) ** Known issues ** - Kernel parameter passing is not done correctly for concurrent kernel execution (somehow concurrentKernels is not affected by this): the parameters are stored inside function_info, which is shared among parallel kernel launches so that the values passed into the launch are likely to get overwritten if multiple grids are launched in parallel streams. - Statistics are printed out whenever the simulation thread runs out of cuda commands (doesn't make sense to print out when a kernel ends during concurrent kernel execution). This will probably require further tweaking so as to be more compatible with data collection scripts. [git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 8302]
Diffstat (limited to 'src/abstract_hardware_model.h')
-rw-r--r--src/abstract_hardware_model.h23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/abstract_hardware_model.h b/src/abstract_hardware_model.h
index c519be1..77a35a7 100644
--- a/src/abstract_hardware_model.h
+++ b/src/abstract_hardware_model.h
@@ -91,6 +91,8 @@ public:
{
m_valid=false;
m_kernel_entry=NULL;
+ m_uid=0;
+ m_num_cores_running=0;
}
kernel_info_t( dim3 gridDim, dim3 blockDim, class function_info *entry )
{
@@ -102,8 +104,22 @@ public:
m_next_cta.y=0;
m_next_cta.z=0;
m_next_tid=m_next_cta;
+ m_num_cores_running=0;
+ m_uid = m_next_uid++;
}
+ void inc_running() { m_num_cores_running++; }
+ void dec_running()
+ {
+ assert( m_num_cores_running > 0 );
+ m_num_cores_running--;
+ }
+ bool running() const { return m_num_cores_running>0; }
+ bool valid() const { return m_valid; }
+ bool done() const
+ {
+ return (!valid()) || (no_more_ctas_to_run() && !running());
+ }
class function_info *entry() { return m_kernel_entry; }
const class function_info *entry() const { return m_kernel_entry; }
@@ -143,15 +159,22 @@ public:
{
return m_next_tid.z < m_block_dim.z && m_next_tid.y < m_block_dim.y && m_next_tid.z < m_block_dim.x;
}
+ unsigned get_uid() const { return m_uid; }
+ std::string name() const;
private:
bool m_valid;
class function_info *m_kernel_entry;
+ unsigned m_uid;
+ static unsigned m_next_uid;
+
dim3 m_grid_dim;
dim3 m_block_dim;
dim3 m_next_cta;
dim3 m_next_tid;
+
+ unsigned m_num_cores_running;
};
struct core_config {