summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMahmoud <[email protected]>2020-06-01 15:10:07 -0400
committerMahmoud <[email protected]>2020-06-01 15:10:07 -0400
commit04b5438cb61b6f040f69fa99fafc971cc43c60ed (patch)
tree6a04f8f796c1a0e3f8924429080480d9ae5ad20f
parentee3c46354c5ce758bf71cfb7bd2e7da7718bcc8a (diff)
ooh forgot to add hashing files
-rw-r--r--src/gpgpu-sim/hashing.cc150
-rw-r--r--src/gpgpu-sim/hashing.h24
2 files changed, 174 insertions, 0 deletions
diff --git a/src/gpgpu-sim/hashing.cc b/src/gpgpu-sim/hashing.cc
new file mode 100644
index 0000000..003755c
--- /dev/null
+++ b/src/gpgpu-sim/hashing.cc
@@ -0,0 +1,150 @@
+// Copyright (c) 2009-2011, Wilson W.L. Fung, Tor M. Aamodt, Ali Bakhoda,
+// 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 <math.h>
+#include <string.h>
+#include "../abstract_hardware_model.h"
+#include "gpu-cache.h"
+
+unsigned ipoly_hash_function(new_addr_type higher_bits, unsigned index,
+ unsigned bank_set_num) {
+ /*
+ * Set Indexing function from "Pseudo-randomly interleaved memory."
+ * Rau, B. R et al.
+ * ISCA 1991
+ * http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=348DEA37A3E440473B3C075EAABC63B6?doi=10.1.1.12.7149&rep=rep1&type=pdf
+ *
+ * equations are corresponding to IPOLY(37) and are adopted from:
+ * "Sacat: streaming-aware conflict-avoiding thrashing-resistant gpgpu
+ * cache management scheme." Khairy et al. IEEE TPDS 2017.
+ *
+ * equations for 16 banks are corresponding to IPOLY(5)
+ * equations for 32 banks are corresponding to IPOLY(37)
+ * equations for 64 banks are corresponding to IPOLY(67)
+ * To see all the IPOLY equations for all the degrees, see
+ * http://wireless-systems.ece.gatech.edu/6604/handouts/Peterson's%20Table.pdf
+ *
+ * We generate these equations using GF(2) arithmetic:
+ * http://www.ee.unb.ca/cgi-bin/tervo/calc.pl?num=&den=&f=d&e=1&m=1
+ *
+ * We go through all the strides 128 (10000000), 256 (100000000),... and
+ * do modular arithmetic in GF(2) Then, we create the H-matrix and group
+ * each bit together, for more info read the ISCA 1991 paper
+ *
+ * IPOLY hashing guarantees conflict-free for all 2^n strides which widely
+ * exit in GPGPU applications and also show good performance for other
+ * strides.
+ */
+ if (bank_set_num == 16) {
+ std::bitset<64> a(higher_bits);
+ std::bitset<4> b(index);
+ std::bitset<4> new_index(index);
+
+ new_index[0] =
+ a[11] ^ a[10] ^ a[9] ^ a[8] ^ a[6] ^ a[4] ^ a[3] ^ a[0] ^ b[0];
+ new_index[1] =
+ a[12] ^ a[8] ^ a[7] ^ a[6] ^ a[5] ^ a[3] ^ a[1] ^ a[0] ^ b[1];
+ new_index[2] = a[9] ^ a[8] ^ a[7] ^ a[6] ^ a[4] ^ a[2] ^ a[1] ^ b[2];
+ new_index[3] = a[10] ^ a[9] ^ a[8] ^ a[7] ^ a[5] ^ a[3] ^ a[2] ^ b[3];
+
+ return new_index.to_ulong();
+
+ } else if (bank_set_num == 32) {
+ std::bitset<64> a(higher_bits);
+ std::bitset<5> b(index);
+ std::bitset<5> new_index(index);
+
+ new_index[0] =
+ a[13] ^ a[12] ^ a[11] ^ a[10] ^ a[9] ^ a[6] ^ a[5] ^ a[3] ^ a[0] ^ b[0];
+ new_index[1] = a[14] ^ a[13] ^ a[12] ^ a[11] ^ a[10] ^ a[7] ^ a[6] ^ a[4] ^
+ a[1] ^ b[1];
+ new_index[2] =
+ a[14] ^ a[10] ^ a[9] ^ a[8] ^ a[7] ^ a[6] ^ a[3] ^ a[2] ^ a[0] ^ b[2];
+ new_index[3] =
+ a[11] ^ a[10] ^ a[9] ^ a[8] ^ a[7] ^ a[4] ^ a[3] ^ a[1] ^ b[3];
+ new_index[4] =
+ a[12] ^ a[11] ^ a[10] ^ a[9] ^ a[8] ^ a[5] ^ a[4] ^ a[2] ^ b[4];
+ return new_index.to_ulong();
+
+ } else if (bank_set_num == 64) {
+ std::bitset<64> a(higher_bits);
+ std::bitset<6> b(index);
+ std::bitset<6> new_index(index);
+
+ new_index[0] = a[18] ^ a[17] ^ a[16] ^ a[15] ^ a[12] ^ a[10] ^ a[6] ^ a[5] ^
+ a[0] ^ b[0];
+ new_index[1] = a[15] ^ a[13] ^ a[12] ^ a[11] ^ a[10] ^ a[7] ^ a[5] ^ a[1] ^
+ a[0] ^ b[1];
+ new_index[2] = a[16] ^ a[14] ^ a[13] ^ a[12] ^ a[11] ^ a[8] ^ a[6] ^ a[2] ^
+ a[1] ^ b[2];
+ new_index[3] = a[17] ^ a[15] ^ a[14] ^ a[13] ^ a[12] ^ a[9] ^ a[7] ^ a[3] ^
+ a[2] ^ b[3];
+ new_index[4] = a[18] ^ a[16] ^ a[15] ^ a[14] ^ a[13] ^ a[10] ^ a[8] ^ a[4] ^
+ a[3] ^ b[4];
+ new_index[5] =
+ a[17] ^ a[16] ^ a[15] ^ a[14] ^ a[11] ^ a[9] ^ a[5] ^ a[4] ^ b[5];
+ return new_index.to_ulong();
+ } else { /* Else incorrect number of channels for the hashing function */
+ assert(
+ "\nmemory_partition_indexing error: The number of "
+ "channels should be "
+ "16, 32 or 64 for the hashing IPOLY index function. other banks "
+ "numbers are not supported. Generate it by yourself! \n" &&
+ 0);
+
+ return 0;
+ }
+}
+
+unsigned bitwise_hash_function(new_addr_type higher_bits, unsigned index,
+ unsigned bank_set_num) {
+ return (index) ^ (higher_bits & (bank_set_num - 1));
+}
+
+unsigned PAE_hash_function(new_addr_type higher_bits, unsigned index,
+ unsigned bank_set_num) {
+ // Page Address Entropy
+ // random selected bits from the page and bank bits
+ // similar to
+ // Liu, Yuxi, et al. "Get Out of the Valley: Power-Efficient Address
+ if (bank_set_num == 32) {
+ std::bitset<64> a(higher_bits);
+ std::bitset<5> b(index);
+ std::bitset<5> new_index(index);
+ new_index[0] = a[13] ^ a[10] ^ a[9] ^ a[5] ^ a[0] ^ b[3] ^ b[0] ^ b[0];
+ new_index[1] = a[12] ^ a[11] ^ a[6] ^ a[1] ^ b[3] ^ b[2] ^ b[1] ^ b[1];
+ new_index[2] = a[14] ^ a[9] ^ a[8] ^ a[7] ^ a[2] ^ b[1] ^ b[2];
+ new_index[3] = a[11] ^ a[10] ^ a[8] ^ a[3] ^ b[2] ^ b[3] ^ b[3];
+ new_index[4] = a[12] ^ a[9] ^ a[8] ^ a[5] ^ a[4] ^ b[1] ^ b[0] ^ b[4];
+
+ return new_index.to_ulong();
+ } else {
+ assert(0);
+ return 0;
+ }
+}
diff --git a/src/gpgpu-sim/hashing.h b/src/gpgpu-sim/hashing.h
new file mode 100644
index 0000000..867c949
--- /dev/null
+++ b/src/gpgpu-sim/hashing.h
@@ -0,0 +1,24 @@
+// author: Mahmoud Khairy, (Purdue Univ)
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "../option_parser.h"
+
+#ifndef HASHING_H
+#define HASHING_H
+
+#include "../abstract_hardware_model.h"
+#include "gpu-cache.h"
+
+unsigned ipoly_hash_function(new_addr_type higher_bits, unsigned index,
+ unsigned bank_set_num);
+
+unsigned bitwise_hash_function(new_addr_type higher_bits, unsigned index,
+ unsigned bank_set_num);
+
+unsigned PAE_hash_function(new_addr_type higher_bits, unsigned index,
+ unsigned bank_set_num);
+
+#endif