summaryrefslogtreecommitdiff
path: root/src/gpgpu-sim/histogram.cc
blob: 67f5c186a9ca8b976b38160968e507ed298904c3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
// Copyright (c) 2009-2011, Tor M. Aamodt, Ali Bakhoda, Wilson W.L. Fung
// The University of British Columbia
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
// 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.
// 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.
//
// 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 HOLDER 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.

#include "histogram.h"

#include <assert.h>

binned_histogram::binned_histogram (std::string name, int nbins, int* bins) 
   : m_name(name), m_nbins(nbins), m_bins(NULL), m_bin_cnts(new int[m_nbins]), m_maximum(0), m_sum(0) 
{
   if (bins) {
      m_bins = new int[m_nbins];
      for (int i = 0; i < nbins; i++) {
         m_bins[i] = bins[i];
      }
   }

   reset_bins();
}

binned_histogram::binned_histogram (const binned_histogram& other)
   : m_name(other.m_name), m_nbins(other.m_nbins), m_bins(NULL), 
     m_bin_cnts(new int[m_nbins]), m_maximum(0), m_sum(0)
{
   for (int i = 0; i < m_nbins; i++) {
      m_bin_cnts[i] = other.m_bin_cnts[i];
   }
}

void binned_histogram::reset_bins () {
   for (int i = 0; i < m_nbins; i++) {
      m_bin_cnts[i] = 0;
   }
}

void binned_histogram::add2bin (int sample) {
   assert(0);
   m_maximum = (sample > m_maximum)? sample : m_maximum;
}

void binned_histogram::fprint (FILE *fout) const
{
   if (m_name.c_str() != NULL) fprintf(fout, "%s = ", m_name.c_str());
   int total_sample = 0;
   for (int i = 0; i < m_nbins; i++) {
      fprintf(fout, "%d ", m_bin_cnts[i]);
      total_sample += m_bin_cnts[i];
   }
   fprintf(fout, "max=%d ", m_maximum);
   float avg = 0.0f;
   if (total_sample > 0) {
      avg = (float)m_sum / total_sample;
   }
   fprintf(fout, "avg=%0.2f ", avg);
}

binned_histogram::~binned_histogram () {
   if (m_bins) delete[] m_bins;
   delete[] m_bin_cnts;
}

pow2_histogram::pow2_histogram (std::string name, int nbins, int* bins) 
   : binned_histogram (name, nbins, bins) {}

void pow2_histogram::add2bin (int sample) {
   assert(sample >= 0);
   
   int bin;
   int v = sample;
   register unsigned int shift;

   bin =   (v > 0xFFFF) << 4; v >>= bin;
   shift = (v > 0xFF  ) << 3; v >>= shift; bin |= shift;
   shift = (v > 0xF   ) << 2; v >>= shift; bin |= shift;
   shift = (v > 0x3   ) << 1; v >>= shift; bin |= shift;
                                           bin |= (v >> 1);
   bin += (sample > 0)? 1:0;
   
   m_bin_cnts[bin] += 1;
   
   m_maximum = (sample > m_maximum)? sample : m_maximum;
   m_sum += sample;
}

linear_histogram::linear_histogram (int stride, const char *name, int nbins, int* bins) 
   : binned_histogram (name, nbins, bins), m_stride(stride)
{
}

void linear_histogram::add2bin (int sample) {
   assert(sample >= 0);

   int bin = sample / m_stride;      
   if (bin >= m_nbins) bin = m_nbins - 1;
   
   m_bin_cnts[bin] += 1;
   
   m_maximum = (sample > m_maximum)? sample : m_maximum;
   m_sum += sample;
}