summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJin Wang <[email protected]>2014-11-13 18:47:03 -0500
committerJin Wang <[email protected]>2016-07-06 02:17:14 -0400
commit69bb1082de9df29d1d7b40486301049767e607b0 (patch)
tree4af4d3d7f5f2a6c336d377da64d7142b038214a5 /src
parent3321626d5e858df8e2154bf4e7a1bacda76658e7 (diff)
BUG: for concurrent kernels on same shader, should select kernel from the distributor directly
Diffstat (limited to 'src')
-rw-r--r--src/gpgpu-sim/gpu-sim.cc4
-rw-r--r--src/gpgpu-sim/shader.cc36
2 files changed, 25 insertions, 15 deletions
diff --git a/src/gpgpu-sim/gpu-sim.cc b/src/gpgpu-sim/gpu-sim.cc
index 8a5d581..10c4ccf 100644
--- a/src/gpgpu-sim/gpu-sim.cc
+++ b/src/gpgpu-sim/gpu-sim.cc
@@ -523,6 +523,10 @@ bool gpgpu_sim::get_more_cta_left() const
kernel_info_t *gpgpu_sim::select_kernel()
{
+ if(m_running_kernels[m_last_issued_kernel] &&
+ !m_running_kernels[m_last_issued_kernel]->no_more_ctas_to_run())
+ return m_running_kernels[m_last_issued_kernel];
+
for(unsigned n=0; n < m_running_kernels.size(); n++ ) {
unsigned idx = (n+m_last_issued_kernel+1)%m_config.max_concurrent_kernel;
if( kernel_more_cta_left(m_running_kernels[idx]) ){
diff --git a/src/gpgpu-sim/shader.cc b/src/gpgpu-sim/shader.cc
index 8cba31e..cd38cb7 100644
--- a/src/gpgpu-sim/shader.cc
+++ b/src/gpgpu-sim/shader.cc
@@ -3263,23 +3263,29 @@ unsigned simt_core_cluster::issue_block2core()
for( unsigned i=0; i < m_config->n_simt_cores_per_cluster; i++ ) {
unsigned core = (i+m_cta_issue_next_core+1)%m_config->n_simt_cores_per_cluster;
- kernel_info_t *kernel = m_core[core]->get_kernel();
-
- //Jin: check if to fetch the next kernel
- if( !m_gpu->kernel_more_cta_left(kernel) ) {
- if(m_config->gpgpu_concurrent_kernel_sm || //concurrent kernel on sm
-
- //otherwise wait till current kernel finishes
- (!m_config->gpgpu_concurrent_kernel_sm &&
- m_core[core]->get_not_completed() == 0) )
- {
- kernel_info_t *k = m_gpu->select_kernel();
- if( k )
- m_core[core]->set_kernel(k);
- }
+ kernel_info_t * kernel;
+ //Jin: fetch kernel according to concurrent kernel setting
+ if(m_config->gpgpu_concurrent_kernel_sm) {//concurrent kernel on sm
+ //always select latest issued kernel
+ kernel_info_t *k = m_gpu->select_kernel();
+ kernel = k;
+ }
+ else {
+ //first select core kernel, if no more cta, get a new kernel
+ //only when core completes
+ kernel = m_core[core]->get_kernel();
+ if( !m_gpu->kernel_more_cta_left(kernel) ) {
+ //wait till current kernel finishes
+ if(m_core[core]->get_not_completed() == 0)
+ {
+ kernel_info_t *k = m_gpu->select_kernel();
+ if( k )
+ m_core[core]->set_kernel(k);
+ kernel = k;
+ }
+ }
}
- kernel = m_core[core]->get_kernel();
if( m_gpu->kernel_more_cta_left(kernel) &&
// (m_core[core]->get_n_active_cta() < m_config->max_cta(*kernel)) ) {
m_core[core]->can_issue_1block(*kernel)) {