summaryrefslogtreecommitdiff
path: root/src/stream_manager.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/stream_manager.cc')
-rw-r--r--src/stream_manager.cc40
1 files changed, 33 insertions, 7 deletions
diff --git a/src/stream_manager.cc b/src/stream_manager.cc
index bb95bb1..d43964a 100644
--- a/src/stream_manager.cc
+++ b/src/stream_manager.cc
@@ -34,15 +34,20 @@
unsigned CUstream_st::sm_next_stream_uid = 0;
-// SST memcpy callbacks
-extern void SST_callback_memcpy_H2D_done();
-extern void SST_callback_memcpy_D2H_done();
+// SST memcpy callbacks, called after a stream operation is done via record_next_done()
+extern void SST_callback_memcpy_H2D_done(uint64_t dst, uint64_t src, size_t count, cudaStream_t stream);
+extern void SST_callback_memcpy_D2H_done(uint64_t dst, uint64_t src, size_t count, cudaStream_t stream);
extern void SST_callback_memcpy_to_symbol_done();
extern void SST_callback_memcpy_from_symbol_done();
-__attribute__((weak)) void SST_callback_memcpy_H2D_done() {}
-__attribute__((weak)) void SST_callback_memcpy_D2H_done() {}
+extern void SST_callback_cudaEventSynchronize_done(cudaEvent_t event);
+extern void SST_callback_kernel_done(cudaStream_t stream);
+__attribute__((weak)) void SST_callback_memcpy_H2D_done(uint64_t dst, uint64_t src, size_t count, cudaStream_t stream) {}
+__attribute__((weak)) void SST_callback_memcpy_D2H_done(uint64_t dst, uint64_t src, size_t count, cudaStream_t stream) {}
__attribute__((weak)) void SST_callback_memcpy_to_symbol_done() {}
__attribute__((weak)) void SST_callback_memcpy_from_symbol_done() {}
+__attribute__((weak)) void SST_callback_cudaEventSynchronize_done(cudaEvent_t event);
+__attribute__((weak)) void SST_callback_kernel_done(cudaStream_t stream);
+
CUstream_st::CUstream_st() {
m_pending = false;
@@ -74,6 +79,10 @@ void CUstream_st::synchronize() {
} while (!done);
}
+bool CUstream_st::synchronize_check() {
+ return m_operations.empty();
+}
+
void CUstream_st::push(const stream_operation &op) {
// called by host thread
pthread_mutex_lock(&m_lock);
@@ -132,13 +141,15 @@ bool stream_operation::do_operation(gpgpu_sim *gpu) {
if (g_debug_execution >= 3) printf("memcpy host-to-device\n");
gpu->memcpy_to_gpu(m_device_address_dst, m_host_address_src, m_cnt);
m_stream->record_next_done();
- if (gpu->is_SST_mode()) SST_callback_memcpy_H2D_done();
+ if (gpu->is_SST_mode()) {
+ SST_callback_memcpy_H2D_done((uint64_t) m_device_address_dst, (uint64_t) m_host_address_src, m_cnt, m_stream->is_stream_zero_stream() ? 0 : m_stream);
+ }
break;
case stream_memcpy_device_to_host:
if (g_debug_execution >= 3) printf("memcpy device-to-host\n");
gpu->memcpy_from_gpu(m_host_address_dst, m_device_address_src, m_cnt);
m_stream->record_next_done();
- if (gpu->is_SST_mode()) SST_callback_memcpy_D2H_done();
+ if (gpu->is_SST_mode()) SST_callback_memcpy_D2H_done((uint64_t) m_host_address_dst, (uint64_t) m_device_address_src, m_cnt, m_stream->is_stream_zero_stream() ? 0 : m_stream);
break;
case stream_memcpy_device_to_device:
if (g_debug_execution >= 3) printf("memcpy device-to-device\n");
@@ -194,6 +205,13 @@ bool stream_operation::do_operation(gpgpu_sim *gpu) {
time_t wallclock = time((time_t *)NULL);
m_event->update(gpu->gpu_tot_sim_cycle, wallclock);
m_stream->record_next_done();
+ if ((gpu->is_SST_mode()) && m_event->done() &&
+ m_event->requested_synchronize()) {
+ // Notify that the event is done
+ SST_callback_cudaEventSynchronize_done(m_event);
+ // Reset the sync flag as we have notified SST
+ m_event->reset_request_synchronize();
+ }
} break;
case stream_wait_event:
// only allows next op to go if event is done
@@ -252,6 +270,9 @@ stream_manager::stream_manager(gpgpu_sim *gpu, bool cuda_launch_blocking) {
m_cuda_launch_blocking = cuda_launch_blocking;
pthread_mutex_init(&m_lock, NULL);
m_last_stream = m_streams.begin();
+
+ // Mark stream zero as the default stream
+ m_stream_zero.set_stream_zero();
}
bool stream_manager::operation(bool *sim) {
@@ -303,6 +324,11 @@ bool stream_manager::register_finished_kernel(unsigned grid_uid) {
// grid_uid, stream->get_uid()); kernel_stat.flush();
// kernel_stat.close();
stream->record_next_done();
+ // Callback to notify a kernel is done for SST's stream
+ // manager to support with nonblocking + blocking kernel launch
+ if (m_gpu->is_SST_mode()) {
+ SST_callback_kernel_done(stream->is_stream_zero_stream() ? 0 : stream);
+ }
m_grid_id_to_stream.erase(grid_uid);
kernel->notify_parent_finished();
delete kernel;