summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/stream_manager.cc50
-rw-r--r--src/stream_manager.h12
2 files changed, 41 insertions, 21 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) {
diff --git a/src/stream_manager.h b/src/stream_manager.h
index 91d1b36..ae1af9f 100644
--- a/src/stream_manager.h
+++ b/src/stream_manager.h
@@ -163,7 +163,6 @@ public:
void print( FILE *fp ) const;
struct CUstream_st *get_stream() { return m_stream; }
void set_stream( CUstream_st *stream ) { m_stream = stream; }
-
private:
struct CUstream_st *m_stream;
@@ -179,9 +178,9 @@ private:
const char *m_symbol;
size_t m_offset;
+ struct CUevent_st *m_event;
bool m_sim_mode;
kernel_info_t *m_kernel;
- struct CUevent_st *m_event;
};
struct CUevent_st {
@@ -193,6 +192,7 @@ public:
m_updates = 0;
m_wallclock = 0;
m_gpu_tot_sim_cycle = 0;
+ m_issued = 0;
m_done = false;
}
void update( double cycle, time_t clk )
@@ -207,11 +207,18 @@ public:
unsigned num_updates() const { return m_updates; }
bool done() const { return m_done; }
time_t clock() const { return m_wallclock; }
+ void issue(){
+ m_issued++;
+ }
+ unsigned int num_issued() const{
+ return m_issued;
+ }
private:
int m_uid;
bool m_blocking;
bool m_done;
int m_updates;
+ unsigned int m_issued;
time_t m_wallclock;
double m_gpu_tot_sim_cycle;
@@ -268,6 +275,7 @@ private:
CUstream_st m_stream_zero;
bool m_service_stream_zero;
pthread_mutex_t m_lock;
+ std::list<struct CUstream_st*>::iterator m_last_stream;
};
#endif