summaryrefslogtreecommitdiff
path: root/src/gpgpu-sim/warp_tracker.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpgpu-sim/warp_tracker.cc')
-rw-r--r--src/gpgpu-sim/warp_tracker.cc271
1 files changed, 0 insertions, 271 deletions
diff --git a/src/gpgpu-sim/warp_tracker.cc b/src/gpgpu-sim/warp_tracker.cc
deleted file mode 100644
index 44cbbc6..0000000
--- a/src/gpgpu-sim/warp_tracker.cc
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * warp_tracker.cc
- *
- * Copyright (c) 2009 by Tor M. Aamodt, Wilson W. L. Fung, Ali Bakhoda and the
- * University of British Columbia
- * Vancouver, BC V6T 1Z4
- * All Rights Reserved.
- *
- * THIS IS A LEGAL DOCUMENT BY DOWNLOADING GPGPU-SIM, YOU ARE AGREEING TO THESE
- * TERMS AND CONDITIONS.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNERS OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * NOTE: The files libcuda/cuda_runtime_api.c and src/cuda-sim/cuda-math.h
- * are derived from the CUDA Toolset available from http://www.nvidia.com/cuda
- * (property of NVIDIA). The files benchmarks/BlackScholes/ and
- * benchmarks/template/ are derived from the CUDA SDK available from
- * http://www.nvidia.com/cuda (also property of NVIDIA). The files from
- * src/intersim/ are derived from Booksim (a simulator provided with the
- * textbook "Principles and Practices of Interconnection Networks" available
- * from http://cva.stanford.edu/books/ppin/). As such, those files are bound by
- * the corresponding legal terms and conditions set forth separately (original
- * copyright notices are left in files from these sources and where we have
- * modified a file our copyright notice appears before the original copyright
- * notice).
- *
- * Using this version of GPGPU-Sim requires a complete installation of CUDA
- * which is distributed seperately by NVIDIA under separate terms and
- * conditions. To use this version of GPGPU-Sim with OpenCL requires a
- * recent version of NVIDIA's drivers which support OpenCL.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the University of British Columbia nor the names of
- * its contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 4. This version of GPGPU-SIM is distributed freely for non-commercial use only.
- *
- * 5. No nonprofit user may place any restrictions on the use of this software,
- * including as modified by the user, by any other authorized user.
- *
- * 6. GPGPU-SIM was developed primarily by Tor M. Aamodt, Wilson W. L. Fung,
- * Ali Bakhoda, George L. Yuan, at the University of British Columbia,
- * Vancouver, BC V6T 1Z4
- */
-
-#include "warp_tracker.h"
-#include "gpu-sim.h"
-#include "shader.h"
-#include <set>
-
-using namespace std;
-
-/*
- * Constructor for warp_tracker_pool.
- *
- * Resizes the warp_tracker map and pool and allocates empty warp_trackers.
- *
- * @param tid_in Array of thread id's corresponding to a warp
- * @param *my_shader Pointer to the shader core
- *
- */
-warp_tracker_pool::warp_tracker_pool(class shader_core_ctx *my_shader)
-{
- m_shader=my_shader;
- const shader_core_config *config = my_shader->get_config();
- gpu_n_thread_per_shader = config->n_thread_per_shader;
- warp_size = config->warp_size;
- warp_tracker_map.resize(gpu_n_thread_per_shader);
-}
-
-/*
- * Register a new warp_tracker with a warp
- *
- * A warp_tracker is fetched from the pool of warp_trackers and assigned to
- * track the input warp. A (sid,tid,pc) to warp_tracker mapping is also stored.
- *
- * @param tid_in Array of thread id's corresponding to a single warp (array of size warp_size)
- * @param *shd Pointer to the shader core
- *
- */
-void warp_tracker_pool::wpt_register_warp( int *tid_in, address_type pc, unsigned n_thd, unsigned warp_size )
-{
- assert(n_thd);
- warp_tracker *wpt = new warp_tracker(tid_in,pc,warp_size);
- // assign the new warp_tracker to warp_tracker_map
- for (unsigned i=0; i<warp_size; i++) {
- if (tid_in[i] >= 0) {
- assert( map_get_warp_tracker(tid_in[i],pc) == NULL );
- map_set_warp_tracker(tid_in[i], pc, wpt);
- }
- }
-}
-
-/*
- * Signal that the current thread has completed and ready to be unlocked.
- *
- * @param tid Thread that is exiting
- * @param *shd Pointer to the shader core
- *
- * @return Returns true is all threads in the warp have completed.
- */
-int warp_tracker_pool::wpt_signal_avail( int tid, address_type pc )
-{
- warp_tracker *wpt = map_get_warp_tracker(tid,pc);
- assert(wpt != NULL);
-
-
- // signal the warp tracker
- if (wpt->avail_thd()) {
- return 1;
- } else {
- return 0;
- }
-}
-
-/*
- * Unlock a warp
- *
- * Unlocks a warp for re-fetching. Sets avail4fetch = 1 for all threads and increments n_avail4fetch
- * by number of active threads.
- *
- * @param tid Thread that is exiting
- *
- */
-void warp_tracker_pool::wpt_deregister_warp( int tid, address_type pc ) {
- warp_tracker *wpt = map_get_warp_tracker(tid,pc);
- assert(wpt != NULL);
- map_clear_warp_tracker(wpt);
- delete wpt;
-}
-
-
-/*
- * Signal that the a thread is done and is exiting (exit instruction)
- *
- * Marks a thread as completed. If all threads in the warp have completed, call register_cta_thread_exit on all
- * threads and removed the warp from warp tracker.
- *
- * @param tid Thread that is exiting
- *
- * @return The warp's mask of active threads.
- */
-int warp_tracker_pool::wpt_signal_complete( int tid, address_type pc )
-{
- warp_tracker *wpt = map_get_warp_tracker(tid,pc);
- assert(wpt != NULL);
-
- // signal the warp tracker
- if (wpt->complete_thd(tid)) {
- // if the warp has completed execution, remove this warp_tracker
- map_clear_warp_tracker(wpt);
- int warp_mask = 0;
- for (unsigned i=0; i<warp_size; i++) {
- if (wpt->tid(i) >= 0) {
- m_shader->register_cta_thread_exit( wpt->tid(i) );
- warp_mask |= (1 << i);
- }
- }
- delete wpt;
- return warp_mask;
- } else {
- return 0;
- }
-}
-
-/*
- * Check if this thread is being tracked by the warp tracker currently
- *
- * Checks if any pc of the given tid maps to a warp_tracker
- *
- * @param tid Thread to check
- *
- * @return True is thread is being tracked
- */
-bool warp_tracker_pool::wpt_thread_in_wpt(int tid) {
- std::map<address_type, warp_tracker*>::iterator it;
- for(it=warp_tracker_map[tid].begin(); it!=warp_tracker_map[tid].end(); it++)
- if((*it).second != NULL)
- return true;
-
- return false;
-}
-
-//------------------------------------------------------------------------------------
-
-map<unsigned, unsigned> thread_pc_tracker::histogram;
-
-thread_pc_tracker *thread_pc_tracker = NULL;
-
-void print_thread_pc_histogram( FILE *fout )
-{
- thread_pc_tracker::histo_print(fout);
-}
-
-void print_thread_pc( FILE *fout, unsigned n_shader )
-{
- fprintf(fout, "SHD_PC_C: ");
- for (unsigned i=0; i<n_shader; i++) {
- fprintf(fout, "%d ", thread_pc_tracker[i].get_acc_pc_count() );
- }
- fprintf(fout, "\n");
-}
-
-// uncomment to enable checking for warp consistency
-// #define CHECK_WARP_CONSISTENCY
-
-void shader_core_ctx::check_stage_pcs( unsigned stage )
-{
-#ifdef CHECK_WARP_CONSISTENCY
- address_type inst_pc = (address_type)-1;
- unsigned tid;
- if( m_config->model == MIMD )
- return;
-
- std::set<unsigned> tids;
-
- for ( int i = 0; i < m_config->warp_size; i++) {
- if (m_pipeline_reg[i][stage].hw_thread_id == -1 )
- continue;
- if ( inst_pc == (address_type)-1 )
- inst_pc = m_pipeline_reg[i][stage].pc;
- tid = m_pipeline_reg[i][stage].hw_thread_id;
- assert( tids.find(tid) == tids.end() );
- tids.insert(tid);
- assert( inst_pc == m_pipeline_reg[i][stage].pc );
- }
-#endif
-}
-
-void shader_core_ctx::check_pm_stage_pcs( unsigned stage )
-{
-#ifdef CHECK_WARP_CONSISTENCY
- address_type inst_pc = (address_type)-1;
- unsigned tid;
- if( m_config->model == MIMD )
- return;
-
- std::set<unsigned> tids;
-
- for (int i = 0; i < m_config->warp_size; i++) {
- if (pre_mem_pipeline[i][stage].hw_thread_id == -1 )
- continue;
- if ( inst_pc == (address_type)-1 )
- inst_pc = pre_mem_pipeline[i][stage].pc;
- tid = pre_mem_pipeline[i][stage].hw_thread_id;
- assert( tids.find(tid) == tids.end() );
- tids.insert(tid);
- assert( inst_pc == pre_mem_pipeline[i][stage].pc );
- }
-#endif
-}