summaryrefslogtreecommitdiff
path: root/src/stream_manager.cc
diff options
context:
space:
mode:
authorJin Wang <[email protected]>2014-10-18 23:07:53 -0400
committerJin Wang <[email protected]>2016-07-05 09:05:36 -0400
commit582106ec595bb7745db092f2f4aa2b0fb9521b16 (patch)
tree8622510691992e4bb4802f60a80a3e9ba8c07127 /src/stream_manager.cc
parent70e02ee5283cb96f0edcb46a15edf0ab6e1d0697 (diff)
MOD: add child kernel stream and scheduling support
Diffstat (limited to 'src/stream_manager.cc')
-rw-r--r--src/stream_manager.cc39
1 files changed, 21 insertions, 18 deletions
diff --git a/src/stream_manager.cc b/src/stream_manager.cc
index dd42f0a..1f93c03 100644
--- a/src/stream_manager.cc
+++ b/src/stream_manager.cc
@@ -155,7 +155,7 @@ void stream_operation::do_operation( gpgpu_sim *gpu )
gpu->set_cache_config(m_kernel->name());
printf("kernel \'%s\' transfer to GPU hardware scheduler\n", m_kernel->name().c_str() );
if( m_sim_mode )
- gpgpu_cuda_ptx_sim_main_func( *m_kernel );
+ gpu->functional_launch( m_kernel );
else
gpu->launch( m_kernel );
}
@@ -212,11 +212,9 @@ bool stream_manager::operation( bool * sim)
bool stream_manager::check_finished_kernel()
{
-
- unsigned grid_uid = m_gpu->finished_kernel();
- bool check=register_finished_kernel(grid_uid);
- return check;
-
+ unsigned grid_uid = m_gpu->finished_kernel();
+ bool check=register_finished_kernel(grid_uid);
+ return check;
}
bool stream_manager::register_finished_kernel(unsigned grid_uid)
@@ -226,13 +224,17 @@ bool stream_manager::register_finished_kernel(unsigned grid_uid)
CUstream_st *stream = m_grid_id_to_stream[grid_uid];
kernel_info_t *kernel = stream->front().get_kernel();
assert( grid_uid == kernel->get_uid() );
- stream->record_next_done();
- m_grid_id_to_stream.erase(grid_uid);
- delete kernel;
- return true;
- }else{
- return false;
+
+ //Jin: should check children kernels for CDP
+ if(kernel->is_finished()) {
+ stream->record_next_done();
+ m_grid_id_to_stream.erase(grid_uid);
+ kernel->notify_parent_finished();
+ delete kernel;
+ return true;
+ }
}
+
return false;
}
@@ -259,21 +261,22 @@ stream_operation stream_manager::front()
{
// called by gpu simulation thread
stream_operation result;
- if( concurrent_streams_empty() )
- m_service_stream_zero = true;
+// if( concurrent_streams_empty() )
+ m_service_stream_zero = true;
if( m_service_stream_zero ) {
- if( !m_stream_zero.empty() ) {
- if( !m_stream_zero.busy() ) {
+ if( !m_stream_zero.empty() && !m_stream_zero.busy() ) {
result = m_stream_zero.next();
if( result.is_kernel() ) {
unsigned grid_id = result.get_kernel()->get_uid();
m_grid_id_to_stream[grid_id] = &m_stream_zero;
}
- }
} else {
m_service_stream_zero = false;
}
- } else {
+ }
+
+ if(!m_service_stream_zero)
+ {
std::list<struct CUstream_st*>::iterator s;
for( s=m_streams.begin(); s != m_streams.end(); s++) {
CUstream_st *stream = *s;