summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libcuda/cuda_runtime_api.cc10
-rw-r--r--src/stream_manager.cc58
-rw-r--r--src/stream_manager.h17
3 files changed, 40 insertions, 45 deletions
diff --git a/libcuda/cuda_runtime_api.cc b/libcuda/cuda_runtime_api.cc
index 7005eef..6a7826e 100644
--- a/libcuda/cuda_runtime_api.cc
+++ b/libcuda/cuda_runtime_api.cc
@@ -1709,13 +1709,13 @@ __host__ cudaError_t CUDARTAPI cudaStreamWaitEvent(cudaStream_t stream, cudaEven
//reference: https://www.cs.cmu.edu/afs/cs/academic/class/15668-s11/www/cuda-doc/html/group__CUDART__STREAM_gfe68d207dc965685d92d3f03d77b0876.html
CUevent_st *e = get_event(event);
if( !e ){
- printf("GPGPU-Sim API: Error at cudaStreamWaitEvent. Event is not created .\n");
- return g_last_cudaError = cudaErrorInvalidResourceHandle;
+ printf("GPGPU-Sim API: Error at cudaStreamWaitEvent. Event is not created .\n");
+ return g_last_cudaError = cudaErrorInvalidResourceHandle;
}
- else if(e->num_issued() == 0){
- printf("GPGPU-Sim API: Warning: cudaEventRecord has not been called on event before calling cudaStreamWaitEvent.\nNothing to be done.\n");
+ else if(e->num_issued() == 0){
+ printf("GPGPU-Sim API: Warning: cudaEventRecord has not been called on event before calling cudaStreamWaitEvent.\nNothing to be done.\n");
return g_last_cudaError = cudaSuccess;
- }
+ }
if (!stream){
g_stream_manager->pushCudaStreamWaitEventToAllStreams(e, flags);
} else {
diff --git a/src/stream_manager.cc b/src/stream_manager.cc
index 6e02dcd..d0eecdd 100644
--- a/src/stream_manager.cc
+++ b/src/stream_manager.cc
@@ -198,13 +198,13 @@ bool stream_operation::do_operation( gpgpu_sim *gpu )
//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;
- }
+ else{
+ return false;
+ }
break;
default:
abort();
@@ -235,7 +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();
+ m_last_stream = m_streams.begin();
}
bool stream_manager::operation( bool * sim)
@@ -336,29 +336,25 @@ stream_operation stream_manager::front()
}
if(!m_service_stream_zero)
{
- 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;
- }
- }
- }
+ 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;
}
@@ -383,8 +379,8 @@ void stream_manager::destroy_stream( CUstream_st *stream )
break;
}
}
- delete stream;
- m_last_stream = m_streams.begin();
+ delete stream;
+ m_last_stream = m_streams.begin();
pthread_mutex_unlock(&m_lock);
}
@@ -398,6 +394,7 @@ 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;
}
@@ -450,6 +447,7 @@ 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 ae1af9f..eb4c6ff 100644
--- a/src/stream_manager.h
+++ b/src/stream_manager.h
@@ -163,6 +163,7 @@ 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;
@@ -178,9 +179,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 {
@@ -192,7 +193,7 @@ public:
m_updates = 0;
m_wallclock = 0;
m_gpu_tot_sim_cycle = 0;
- m_issued = 0;
+ m_issued = 0;
m_done = false;
}
void update( double cycle, time_t clk )
@@ -207,18 +208,14 @@ 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;
- }
+ 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;
+ unsigned int m_issued;
time_t m_wallclock;
double m_gpu_tot_sim_cycle;
@@ -275,7 +272,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;
+ std::list<struct CUstream_st*>::iterator m_last_stream;
};
#endif