summaryrefslogtreecommitdiff
path: root/src/abstract_hardware_model.cc
diff options
context:
space:
mode:
authorspeverel <[email protected]>2017-08-10 15:00:36 -0700
committerGitHub <[email protected]>2017-08-10 15:00:36 -0700
commit21ad40b4918f08bf8508487b9aab700948fe8c84 (patch)
treec271e1e71da35305356e998699249f266ff1c08e /src/abstract_hardware_model.cc
parent0afe825c212560c3b473366d005a50c2568cad1a (diff)
parent1be6f76f5d57bd5dda6f0ca4dae3824f0e55eff9 (diff)
Merge pull request #1 from gpgpu-sim/dev
Dev
Diffstat (limited to 'src/abstract_hardware_model.cc')
-rw-r--r--src/abstract_hardware_model.cc110
1 files changed, 110 insertions, 0 deletions
diff --git a/src/abstract_hardware_model.cc b/src/abstract_hardware_model.cc
index 84d165c..fe6f8ab 100644
--- a/src/abstract_hardware_model.cc
+++ b/src/abstract_hardware_model.cc
@@ -550,6 +550,9 @@ void warp_inst_t::completed( unsigned long long cycle ) const
ptx_file_line_stats_add_latency(pc, latency * active_count());
}
+//Jin: CDP support
+bool g_cdp_enabled;
+unsigned g_kernel_launch_latency;
unsigned kernel_info_t::m_next_uid = 1;
@@ -565,11 +568,18 @@ kernel_info_t::kernel_info_t( dim3 gridDim, dim3 blockDim, class function_info *
m_num_cores_running=0;
m_uid = m_next_uid++;
m_param_mem = new memory_space_impl<8192>("param",64*1024);
+
+ //Jin: parent and child kernel management for CDP
+ m_parent_kernel = NULL;
+
+ //Jin: launch latency management
+ m_launch_latency = g_kernel_launch_latency;
}
kernel_info_t::~kernel_info_t()
{
assert( m_active_threads.empty() );
+ destroy_cta_streams();
delete m_param_mem;
}
@@ -578,6 +588,106 @@ std::string kernel_info_t::name() const
return m_kernel_entry->get_name();
}
+//Jin: parent and child kernel management for CDP
+void kernel_info_t::set_parent(kernel_info_t * parent,
+ dim3 parent_ctaid, dim3 parent_tid) {
+ m_parent_kernel = parent;
+ m_parent_ctaid = parent_ctaid;
+ m_parent_tid = parent_tid;
+ parent->set_child(this);
+}
+
+void kernel_info_t::set_child(kernel_info_t * child) {
+ m_child_kernels.push_back(child);
+}
+
+void kernel_info_t::remove_child(kernel_info_t * child) {
+ assert(std::find(m_child_kernels.begin(), m_child_kernels.end(), child)
+ != m_child_kernels.end());
+ m_child_kernels.remove(child);
+}
+
+bool kernel_info_t::is_finished() {
+ if(done() && children_all_finished())
+ return true;
+ else
+ return false;
+}
+
+bool kernel_info_t::children_all_finished() {
+ if(!m_child_kernels.empty())
+ return false;
+
+ return true;
+}
+
+void kernel_info_t::notify_parent_finished() {
+ if(m_parent_kernel) {
+ extern unsigned long long g_total_param_size;
+ g_total_param_size -= ((m_kernel_entry->get_args_aligned_size() + 255)/256*256);
+ m_parent_kernel->remove_child(this);
+ g_stream_manager->register_finished_kernel(m_parent_kernel->get_uid());
+ }
+}
+
+CUstream_st * kernel_info_t::create_stream_cta(dim3 ctaid) {
+ assert(get_default_stream_cta(ctaid));
+ CUstream_st * stream = new CUstream_st();
+ g_stream_manager->add_stream(stream);
+ assert(m_cta_streams.find(ctaid) != m_cta_streams.end());
+ assert(m_cta_streams[ctaid].size() >= 1); //must have default stream
+ m_cta_streams[ctaid].push_back(stream);
+
+ return stream;
+}
+
+CUstream_st * kernel_info_t::get_default_stream_cta(dim3 ctaid) {
+ if(m_cta_streams.find(ctaid) != m_cta_streams.end()) {
+ assert(m_cta_streams[ctaid].size() >= 1); //already created, must have default stream
+ return *(m_cta_streams[ctaid].begin());
+ }
+ else {
+ m_cta_streams[ctaid] = std::list<CUstream_st *>();
+ CUstream_st * stream = new CUstream_st();
+ g_stream_manager->add_stream(stream);
+ m_cta_streams[ctaid].push_back(stream);
+ return stream;
+ }
+}
+
+bool kernel_info_t::cta_has_stream(dim3 ctaid, CUstream_st* stream) {
+ if(m_cta_streams.find(ctaid) == m_cta_streams.end())
+ return false;
+
+ std::list<CUstream_st *> &stream_list = m_cta_streams[ctaid];
+ if(std::find(stream_list.begin(), stream_list.end(), stream)
+ == stream_list.end())
+ return false;
+ else
+ return true;
+}
+
+void kernel_info_t::print_parent_info() {
+ if(m_parent_kernel) {
+ printf("Parent %d: \'%s\', Block (%d, %d, %d), Thread (%d, %d, %d)\n",
+ m_parent_kernel->get_uid(), m_parent_kernel->name().c_str(),
+ m_parent_ctaid.x, m_parent_ctaid.y, m_parent_ctaid.z,
+ m_parent_tid.x, m_parent_tid.y, m_parent_tid.z);
+ }
+}
+
+void kernel_info_t::destroy_cta_streams() {
+ printf("Destroy streams for kernel %d: ", get_uid()); size_t stream_size = 0;
+ for(auto s = m_cta_streams.begin(); s != m_cta_streams.end(); s++) {
+ stream_size += s->second.size();
+ for(auto ss = s->second.begin(); ss != s->second.end(); ss++)
+ g_stream_manager->destroy_stream(*ss);
+ s->second.clear();
+ }
+ printf("size %lu\n", stream_size);
+ m_cta_streams.clear();
+}
+
simt_stack::simt_stack( unsigned wid, unsigned warpSize)
{
m_warp_id=wid;