CCTLib
Calling-context and data-object attribution library for Intel Pin
ins_reuse_client.cpp File Reference
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <atomic>
#include <malloc.h>
#include <iostream>
#include <fstream>
#include <unistd.h>
#include <assert.h>
#include <string.h>
#include <sys/mman.h>
#include <sstream>
#include <functional>
#include <unordered_set>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <list>
#include <nlohmann/json.hpp>
#include "pin.H"
#include "cctlib.H"
#include "shadow_memory.H"
#include "rbtree.h"
#include <xmmintrin.h>
#include <immintrin.h>
#include <sys/time.h>
#include <sys/resource.h>
#include "xed-interface.h"
#include "xed-common-hdrs.h"
#include <google/sparse_hash_map>
#include <google/dense_hash_map>
+ Include dependency graph for ins_reuse_client.cpp:

Go to the source code of this file.

Classes

struct  InsReuseThreadData
 

Macros

#define MAX_REUSE_DISTANCE_BINS   (32)
 
#define MAX_REUSE_DISTANCE   (1ULL << (MAX_REUSE_DISTANCE_BINS))
 
#define CACHELINE_BIT   (6)
 
#define CACHELINE_SIZE   (1L << CACHELINE_BIT)
 
#define NUM_BLOCKS   (3)
 
#define NUM_CACHE_LEVELS   (4)
 
#define FIRST_USE   (ULLONG_MAX)
 
#define MULTI_THREADED
 

Typedefs

using json = nlohmann::json
 
using RBTree_t = RBTree< uint64_t, uint32_t, uint64_t >
 

Functions

static KNOB< bool > KnobCCT (KNOB_MODE_WRITEONCE, "pintool", "cct", "0", "Enable CCT-level LRU eviction pair tracking")
 
static KNOB< UINT64 > KnobL1iCap (KNOB_MODE_WRITEONCE, "pintool", "l1i_cap", "8192", "L1i capacity in unique instructions")
 
static KNOB< UINT64 > KnobL2Cap (KNOB_MODE_WRITEONCE, "pintool", "l2_cap", "65536", "L2 capacity in unique instructions")
 
static KNOB< UINT64 > KnobL3Cap (KNOB_MODE_WRITEONCE, "pintool", "l3_cap", "2097152", "L3 capacity in unique instructions")
 
static KNOB< UINT64 > KnobITLBCap (KNOB_MODE_WRITEONCE, "pintool", "itlb_cap", "64", "iTLB capacity in 4K pages")
 
static KNOB< UINT32 > KnobTopN (KNOB_MODE_WRITEONCE, "pintool", "topn", "100", "Top-N eviction pairs to report per level")
 
InsReuseThreadDataClientGetTLS (const THREADID threadId)
 
static size_t GetBlock (size_t addr, size_t blockMask)
 
static INT32 Usage ()
 
static void ClientInit (int argc, char *argv[])
 
static void UpdateInsReuseStats (uint64_t distance, uint64_t count, InsReuseThreadData *tData)
 
static void UpdateBlockReuseStats (uint64_t distance, uint64_t count, uint64_t *reuseHisto)
 
static uint64_t ComputeInsReuseDistance (uint64_t prevTick, uint64_t newTick, uint32_t v, InsReuseThreadData *tData, RBTree_t *rbt, uint32_t payload=0)
 
static VOID InstrumentInsCallback (INS ins, VOID *v, const uint32_t slot)
 
static void RecordEvictionPair (ContextHandle_t victimCtxt, ContextHandle_t curCtxt, unordered_map< uint64_t, uint64_t > &pairMap)
 
static void CheckEvictions (RBTree_t &tree, ContextHandle_t curCtxt, uint64_t reuseDistance, bool isFirstUse, const uint64_t *capacities, int numLevels, unordered_map< uint64_t, uint64_t > *missPairs)
 
static uint64_t ComputeBlockReuseDistance (uint64_t prevTick, uint64_t newTick, uint32_t v, InsReuseThreadData *tData, RBTree_t *rbt)
 
static void AnalyzeInsLevelReuse (void *insAddr, uint32_t numInsInBBL, uint32_t slot, THREADID threadId)
 
template<int blockSize, int blkIdx>
static void AnalyzeBlockLevelReuse (void *block, uint32_t numInsInBlock, THREADID threadId)
 
static void InstrumentInsLevelReuse (TRACE trace, void *f)
 
template<int blockSize, int blkIdx>
static void InstrumentMemBlockLevelReuse (TRACE trace, void *f)
 
static void InstrumentTrace (TRACE trace, void *f)
 
static VOID ImageUnload (IMG img, VOID *v)
 
static void DumpHisto (uint64_t *histo, uint64_t footprint, const string &key1, const string &key2)
 
static VOID ThreadFiniFunc (THREADID threadid, const CONTEXT *ctxt, INT32 code, VOID *v)
 
static VOID FiniFunc (INT32 code, VOID *v)
 
static void InitThreadData (InsReuseThreadData *tdata)
 
static VOID ThreadStart (THREADID threadid, CONTEXT *ctxt, INT32 flags, VOID *v)
 
int main (int argc, char *argv[])
 

Variables

static bool gCCTEnabled = false
 
static uint64_t gCacheCapacities [NUM_CACHE_LEVELS]
 
static const char * gCacheLevelNames [NUM_CACHE_LEVELS] = {"L1i", "L2", "L3", "iTLB"}
 
static unordered_map< ADDRINT, uint32_t > gAddrToSlot
 
struct {
   char   dummy1 [128]
 
   xed_state_t   xedState
 
   char   dummy2 [128]
 
InsReuseGlobals
 
struct {
   size_t   blkSize
 
   char *   blkDescription
 
BLK_INFO [NUM_BLOCKS]
 
struct {
   PIN_LOCK   lock
 
   uint64_t   numInsExecuted
 
   uint64_t   footprint
 
   uint64_t   insReuseHisto [MAX_REUSE_DISTANCE_BINS]
 
   struct {
      uint64_t   numBlocksCounter
 
      uint64_t   footprint
 
      uint64_t   reuseHisto [MAX_REUSE_DISTANCE_BINS]
 
   }   blockData [NUM_BLOCKS]
 
   unordered_map< uint64_t, uint64_t >   missPairs [NUM_CACHE_LEVELS]
 
GLOBAL_STATS
 
static TLS_KEY client_tls_key
 
static InsReuseThreadDatagSingleThreadedTData
 
static FILE * gTraceFile
 
static ofstream gJSONFile
 

Macro Definition Documentation

◆ CACHELINE_BIT

#define CACHELINE_BIT   (6)

Definition at line 54 of file ins_reuse_client.cpp.

◆ CACHELINE_SIZE

#define CACHELINE_SIZE   (1L << CACHELINE_BIT)

Definition at line 55 of file ins_reuse_client.cpp.

◆ FIRST_USE

#define FIRST_USE   (ULLONG_MAX)

Definition at line 60 of file ins_reuse_client.cpp.

◆ MAX_REUSE_DISTANCE

#define MAX_REUSE_DISTANCE   (1ULL << (MAX_REUSE_DISTANCE_BINS))

Definition at line 52 of file ins_reuse_client.cpp.

◆ MAX_REUSE_DISTANCE_BINS

#define MAX_REUSE_DISTANCE_BINS   (32)

Definition at line 51 of file ins_reuse_client.cpp.

◆ MULTI_THREADED

#define MULTI_THREADED

Definition at line 62 of file ins_reuse_client.cpp.

◆ NUM_BLOCKS

#define NUM_BLOCKS   (3)

Definition at line 57 of file ins_reuse_client.cpp.

◆ NUM_CACHE_LEVELS

#define NUM_CACHE_LEVELS   (4)

Definition at line 58 of file ins_reuse_client.cpp.

Typedef Documentation

◆ json

using json = nlohmann::json

Definition at line 46 of file ins_reuse_client.cpp.

◆ RBTree_t

using RBTree_t = RBTree<uint64_t, uint32_t, uint64_t>

Definition at line 86 of file ins_reuse_client.cpp.

Function Documentation

◆ AnalyzeBlockLevelReuse()

template<int blockSize, int blkIdx>
static void AnalyzeBlockLevelReuse ( void *  block,
uint32_t  numInsInBlock,
THREADID  threadId 
)
inlinestatic

◆ AnalyzeInsLevelReuse()

◆ CheckEvictions()

static void CheckEvictions ( RBTree_t tree,
ContextHandle_t  curCtxt,
uint64_t  reuseDistance,
bool  isFirstUse,
const uint64_t *  capacities,
int  numLevels,
unordered_map< uint64_t, uint64_t > *  missPairs 
)
inlinestatic

◆ ClientGetTLS()

InsReuseThreadData* ClientGetTLS ( const THREADID  threadId)
inline

◆ ClientInit()

static void ClientInit ( int  argc,
char *  argv[] 
)
static

◆ ComputeBlockReuseDistance()

static uint64_t ComputeBlockReuseDistance ( uint64_t  prevTick,
uint64_t  newTick,
uint32_t  v,
InsReuseThreadData tData,
RBTree_t rbt 
)
inlinestatic

◆ ComputeInsReuseDistance()

static uint64_t ComputeInsReuseDistance ( uint64_t  prevTick,
uint64_t  newTick,
uint32_t  v,
InsReuseThreadData tData,
RBTree_t rbt,
uint32_t  payload = 0 
)
inlinestatic

◆ DumpHisto()

static void DumpHisto ( uint64_t *  histo,
uint64_t  footprint,
const string &  key1,
const string &  key2 
)
static

Definition at line 613 of file ins_reuse_client.cpp.

References footprint, gJSONFile, gTraceFile, and MAX_REUSE_DISTANCE_BINS.

Referenced by FiniFunc(), and ThreadFiniFunc().

◆ FiniFunc()

static VOID FiniFunc ( INT32  code,
VOID *  v 
)
static

Definition at line 681 of file ins_reuse_client.cpp.

References BLK_INFO, blkDescription, blkSize, DumpHisto(), gJSONFile, GLOBAL_STATS, gTraceFile, and NUM_BLOCKS.

Referenced by main().

◆ GetBlock()

static size_t GetBlock ( size_t  addr,
size_t  blockMask 
)
inlinestatic

Definition at line 157 of file ins_reuse_client.cpp.

Referenced by InstrumentMemBlockLevelReuse().

◆ ImageUnload()

static VOID ImageUnload ( IMG  img,
VOID *  v 
)
static

◆ InitThreadData()

◆ InstrumentInsCallback()

static VOID InstrumentInsCallback ( INS  ins,
VOID *  v,
const uint32_t  slot 
)
static

Definition at line 299 of file ins_reuse_client.cpp.

References gAddrToSlot.

Referenced by main().

◆ InstrumentInsLevelReuse()

static void InstrumentInsLevelReuse ( TRACE  trace,
void *  f 
)
static

Definition at line 470 of file ins_reuse_client.cpp.

References AnalyzeInsLevelReuse(), gAddrToSlot, and gCCTEnabled.

Referenced by InstrumentTrace().

◆ InstrumentMemBlockLevelReuse()

template<int blockSize, int blkIdx>
static void InstrumentMemBlockLevelReuse ( TRACE  trace,
void *  f 
)
static

Definition at line 492 of file ins_reuse_client.cpp.

References GetBlock().

Referenced by InstrumentTrace().

◆ InstrumentTrace()

static void InstrumentTrace ( TRACE  trace,
void *  f 
)
static

Definition at line 537 of file ins_reuse_client.cpp.

References BLK_INFO, f(), InstrumentInsLevelReuse(), and InstrumentMemBlockLevelReuse().

Referenced by main().

◆ KnobCCT()

static KNOB<bool> KnobCCT ( KNOB_MODE_WRITEONCE  ,
"pintool"  ,
"cct"  ,
"0"  ,
"Enable CCT-level LRU eviction pair tracking"   
)
static

Referenced by main().

◆ KnobITLBCap()

static KNOB<UINT64> KnobITLBCap ( KNOB_MODE_WRITEONCE  ,
"pintool"  ,
"itlb_cap"  ,
"64"  ,
"iTLB capacity in 4K pages"   
)
static

Referenced by main().

◆ KnobL1iCap()

static KNOB<UINT64> KnobL1iCap ( KNOB_MODE_WRITEONCE  ,
"pintool"  ,
"l1i_cap"  ,
"8192"  ,
"L1i capacity in unique instructions"   
)
static

Referenced by main().

◆ KnobL2Cap()

static KNOB<UINT64> KnobL2Cap ( KNOB_MODE_WRITEONCE  ,
"pintool"  ,
"l2_cap"  ,
"65536"  ,
"L2 capacity in unique instructions"   
)
static

Referenced by main().

◆ KnobL3Cap()

static KNOB<UINT64> KnobL3Cap ( KNOB_MODE_WRITEONCE  ,
"pintool"  ,
"l3_cap"  ,
"2097152"  ,
"L3 capacity in unique instructions"   
)
static

Referenced by main().

◆ KnobTopN()

static KNOB<UINT32> KnobTopN ( KNOB_MODE_WRITEONCE  ,
"pintool"  ,
"topn"  ,
"100"  ,
"Top-N eviction pairs to report per level"   
)
static

Referenced by ImageUnload().

◆ main()

◆ RecordEvictionPair()

static void RecordEvictionPair ( ContextHandle_t  victimCtxt,
ContextHandle_t  curCtxt,
unordered_map< uint64_t, uint64_t > &  pairMap 
)
inlinestatic

Definition at line 303 of file ins_reuse_client.cpp.

References curCtxt.

Referenced by AnalyzeInsLevelReuse(), and CheckEvictions().

◆ ThreadFiniFunc()

◆ ThreadStart()

static VOID ThreadStart ( THREADID  threadid,
CONTEXT *  ctxt,
INT32  flags,
VOID *  v 
)
static

Definition at line 731 of file ins_reuse_client.cpp.

References client_tls_key, gSingleThreadedTData, and InitThreadData().

Referenced by main().

◆ UpdateBlockReuseStats()

static void UpdateBlockReuseStats ( uint64_t  distance,
uint64_t  count,
uint64_t *  reuseHisto 
)
inlinestatic

Definition at line 258 of file ins_reuse_client.cpp.

References MAX_REUSE_DISTANCE, MAX_REUSE_DISTANCE_BINS, and reuseHisto.

Referenced by AnalyzeBlockLevelReuse().

◆ UpdateInsReuseStats()

static void UpdateInsReuseStats ( uint64_t  distance,
uint64_t  count,
InsReuseThreadData tData 
)
inlinestatic

◆ Usage()

static INT32 Usage ( )
static

Definition at line 162 of file ins_reuse_client.cpp.

Referenced by main().

Variable Documentation

◆ 

constexpr { ... } BLK_INFO[NUM_BLOCKS]
Initial value:
= {
{CACHELINE_SIZE, (char*)"64B CacheLineReuse"},
{4096, (char*)"4K OS PageSizeReuse"},
{1L << 21, (char*)"2M Huge PageSizeReuse"},
}
#define CACHELINE_SIZE

Referenced by FiniFunc(), InstrumentTrace(), and ThreadFiniFunc().

◆ blkDescription

char* blkDescription

Definition at line 90 of file ins_reuse_client.cpp.

Referenced by FiniFunc(), and ThreadFiniFunc().

◆ blkSize

size_t blkSize

Definition at line 89 of file ins_reuse_client.cpp.

Referenced by FiniFunc(), and ThreadFiniFunc().

◆ 

struct { ... } blockData[NUM_BLOCKS]

Referenced by AnalyzeBlockLevelReuse().

◆ client_tls_key

TLS_KEY client_tls_key
static

Definition at line 143 of file ins_reuse_client.cpp.

Referenced by ClientGetTLS(), main(), and ThreadStart().

◆ dummy1

char dummy1[128]

Definition at line 81 of file ins_reuse_client.cpp.

◆ dummy2

char dummy2[128]

Definition at line 83 of file ins_reuse_client.cpp.

◆ footprint

uint64_t footprint

Definition at line 131 of file ins_reuse_client.cpp.

Referenced by DumpHisto().

◆ gAddrToSlot

unordered_map<ADDRINT, uint32_t> gAddrToSlot
static

Definition at line 77 of file ins_reuse_client.cpp.

Referenced by InstrumentInsCallback(), and InstrumentInsLevelReuse().

◆ gCacheCapacities

uint64_t gCacheCapacities[NUM_CACHE_LEVELS]
static

Definition at line 73 of file ins_reuse_client.cpp.

Referenced by AnalyzeInsLevelReuse(), ImageUnload(), and main().

◆ gCacheLevelNames

const char* gCacheLevelNames[NUM_CACHE_LEVELS] = {"L1i", "L2", "L3", "iTLB"}
static

Definition at line 74 of file ins_reuse_client.cpp.

Referenced by ImageUnload().

◆ gCCTEnabled

bool gCCTEnabled = false
static

◆ gJSONFile

ofstream gJSONFile
static

Definition at line 169 of file ins_reuse_client.cpp.

Referenced by ClientInit(), DumpHisto(), FiniFunc(), and ImageUnload().

◆ 

struct { ... } GLOBAL_STATS

◆ gSingleThreadedTData

InsReuseThreadData* gSingleThreadedTData
static

Definition at line 144 of file ins_reuse_client.cpp.

Referenced by ClientGetTLS(), and ThreadStart().

◆ gTraceFile

FILE* gTraceFile
static

Definition at line 168 of file ins_reuse_client.cpp.

Referenced by ClientInit(), DumpHisto(), FiniFunc(), ImageUnload(), main(), and ThreadFiniFunc().

◆ 

struct { ... } InsReuseGlobals

Referenced by ClientInit().

◆ insReuseHisto

uint64_t insReuseHisto[MAX_REUSE_DISTANCE_BINS]

Definition at line 132 of file ins_reuse_client.cpp.

◆ lock

PIN_LOCK lock

Definition at line 129 of file ins_reuse_client.cpp.

◆ missPairs

unordered_map<uint64_t, uint64_t> missPairs[NUM_CACHE_LEVELS]

Definition at line 138 of file ins_reuse_client.cpp.

Referenced by CheckEvictions().

◆ numBlocksCounter

uint64_t numBlocksCounter

Definition at line 134 of file ins_reuse_client.cpp.

◆ numInsExecuted

uint64_t numInsExecuted

Definition at line 130 of file ins_reuse_client.cpp.

◆ reuseHisto

uint64_t reuseHisto[MAX_REUSE_DISTANCE_BINS]

Definition at line 136 of file ins_reuse_client.cpp.

Referenced by UpdateBlockReuseStats().

◆ xedState

xed_state_t xedState

Definition at line 82 of file ins_reuse_client.cpp.