summaryrefslogtreecommitdiff
path: root/src/stream_manager.cc
diff options
context:
space:
mode:
authorboyealkim <[email protected]>2019-07-25 20:42:13 +0900
committerboyealkim <[email protected]>2019-07-25 20:42:13 +0900
commitf829a12add380c78e50ecc86357d4a1b513f21f0 (patch)
tree3f1d13131230e17ee512479794cc4241d5d06eac /src/stream_manager.cc
parenta1e2c4273542ca78098c9f4f25eebc087e0aec37 (diff)
fix stream_merge front algo
Diffstat (limited to 'src/stream_manager.cc')
-rw-r--r--src/stream_manager.cc50
1 files changed, 31 insertions, 19 deletions
diff --git a/src/stream_manager.cc b/src/stream_manager.cc
index 6cd62a2..6e02dcd 100644
--- a/src/stream_manager.cc
+++ b/src/stream_manager.cc
@@ -194,14 +194,17 @@ bool stream_operation::do_operation( gpgpu_sim *gpu )
m_stream->record_next_done();
}
break;
- case stream_wait_event: {
+ case stream_wait_event:
//only allows next op to go if event is done
//otherwise stays in the stream queue
printf("stream wait event processing...\n");
- if(m_event->done())
+ if(m_event->done()){
printf("stream wait event done\n");
m_stream->record_next_done();
}
+ else{
+ return false;
+ }
break;
default:
abort();
@@ -232,6 +235,7 @@ stream_manager::stream_manager( gpgpu_sim *gpu, bool cuda_launch_blocking )
m_service_stream_zero = false;
m_cuda_launch_blocking = cuda_launch_blocking;
pthread_mutex_init(&m_lock,NULL);
+ m_last_stream = m_streams.begin();
}
bool stream_manager::operation( bool * sim)
@@ -330,22 +334,31 @@ stream_operation stream_manager::front()
m_service_stream_zero = false;
}
}
-
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;
- if( !stream->busy() && !stream->empty() ) {
- result = stream->next();
- if( result.is_kernel() ) {
- unsigned grid_id = result.get_kernel()->get_uid();
- m_grid_id_to_stream[grid_id] = stream;
- }
- break;
- }
- }
- }
+ std::list<struct CUstream_st*>::iterator s = m_last_stream;
+ if(m_last_stream == m_streams.end()){
+ s = m_streams.begin();
+ }
+ else{
+ s++;
+ }
+ for(size_t ii = 0 ; ii < m_streams.size(); ii++, s++) {
+ if(s == m_streams.end()){
+ s = m_streams.begin();
+ }
+ m_last_stream = s;
+ CUstream_st *stream = *s;
+ if( !stream->busy() && !stream->empty() ) {
+ result = stream->next();
+ if( result.is_kernel() ) {
+ unsigned grid_id = result.get_kernel()->get_uid();
+ m_grid_id_to_stream[grid_id] = stream;
+ }
+ break;
+ }
+ }
+ }
return result;
}
@@ -370,7 +383,8 @@ void stream_manager::destroy_stream( CUstream_st *stream )
break;
}
}
- delete stream;
+ delete stream;
+ m_last_stream = m_streams.begin();
pthread_mutex_unlock(&m_lock);
}
@@ -384,7 +398,6 @@ bool stream_manager::concurrent_streams_empty()
for( s=m_streams.begin(); s!=m_streams.end();++s ) {
struct CUstream_st *stream = *s;
if( !stream->empty() ) {
- //stream->print(stdout);
result = false;
break;
}
@@ -437,7 +450,6 @@ void stream_manager::print_impl( FILE *fp)
void stream_manager::push( stream_operation op )
{
struct CUstream_st *stream = op.get_stream();
-
// block if stream 0 (or concurrency disabled) and pending concurrent operations exist
bool block= !stream || m_cuda_launch_blocking;
while(block) {