diff options
| author | Wilson Fung <[email protected]> | 2011-07-26 15:49:51 -0800 |
|---|---|---|
| committer | Andrew Boktor <[email protected]> | 2014-08-14 13:18:22 -0700 |
| commit | 9ba14bafc4e02f6a125a1df96d80f508c306488c (patch) | |
| tree | d4af293ddeaffc4667985e5c238f01475575f713 /src/gpgpu-sim | |
| parent | 26fcdea70d160bfe395d1bc17877127c5593efb5 (diff) | |
Integration change from CL8943 to fix barrier behaviour.
[git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 9884]
Diffstat (limited to 'src/gpgpu-sim')
| -rw-r--r-- | src/gpgpu-sim/shader.cc | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/gpgpu-sim/shader.cc b/src/gpgpu-sim/shader.cc index ceb67cb..5be7a9c 100644 --- a/src/gpgpu-sim/shader.cc +++ b/src/gpgpu-sim/shader.cc @@ -1743,6 +1743,20 @@ void barrier_set_t::warp_exit( unsigned warp_id ) // caller needs to verify all threads in warp are done, e.g., by checking PDOM stack to // see it has only one entry during exit_impl() m_warp_active.reset(warp_id); + + // test for barrier release + cta_to_warp_t::iterator w=m_cta_to_warps.begin(); + for (; w != m_cta_to_warps.end(); ++w) { + if (w->second.test(warp_id) == true) break; + } + warp_set_t warps_in_cta = w->second; + warp_set_t at_barrier = warps_in_cta & m_warp_at_barrier; + warp_set_t active = warps_in_cta & m_warp_active; + + if( at_barrier == active ) { + // all warps have reached barrier, so release waiting warps... + m_warp_at_barrier &= ~at_barrier; + } } // assertions |
