mirror of
https://github.com/andreas-abel/nanoBench.git
synced 2025-12-16 11:30:07 +01:00
wbinvd in access sequences
This commit is contained in:
@@ -19,7 +19,7 @@ The tool will make memory accesses to four different blocks in all of the specif
|
|||||||
|
|
||||||
Between every two accesses to the same set in a lower-level cache, the tool automatically adds enough accesses to the higher-level caches (that map to different sets and/or slices in the lower-level cache) to make sure that the corresponding lines are evicted from the higher-level cache and the access actually reaches the lower-level cache. These additional accesses are excluded from the performance counter measurements.
|
Between every two accesses to the same set in a lower-level cache, the tool automatically adds enough accesses to the higher-level caches (that map to different sets and/or slices in the lower-level cache) to make sure that the corresponding lines are evicted from the higher-level cache and the access actually reaches the lower-level cache. These additional accesses are excluded from the performance counter measurements.
|
||||||
|
|
||||||
By default, the `WBINVD` instruction is call before executing the access sequence. This can be disabled with the `-noWbinvd` option.
|
By default, the `wbinvd` instruction is called before executing the access sequence. This can be disabled with the `-noWbinvd` option. It is also possible to execute the `wbinvd` instruction between specific elements of an access sequence by inserting `<wbinvd>` at the corresponding location in the access sequence.
|
||||||
|
|
||||||
The tool has the following command-line options:
|
The tool has the following command-line options:
|
||||||
|
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ def main():
|
|||||||
blocksStr = args.blocks
|
blocksStr = args.blocks
|
||||||
else:
|
else:
|
||||||
blocksStr = args.seq
|
blocksStr = args.seq
|
||||||
|
blocksStr = blocksStr.replace('<wbinvd>', '')
|
||||||
blocks = list(OrderedDict.fromkeys(re.sub('[?!,;]', ' ', blocksStr).split()))
|
blocks = list(OrderedDict.fromkeys(re.sub('[?!,;]', ' ', blocksStr).split()))
|
||||||
|
|
||||||
html = ['<html>', '<head>', '<script src="https://cdn.plot.ly/plotly-latest.min.js">', '</script>', '</head>', '<body>']
|
html = ['<html>', '<head>', '<script src="https://cdn.plot.ly/plotly-latest.min.js">', '</script>', '</head>', '<body>']
|
||||||
|
|||||||
@@ -174,7 +174,7 @@ def getCBoxOfAddress(address):
|
|||||||
setNanoBenchParameters(config='', msrConfig=getDefaultCacheMSRConfig(), nMeasurements=10, unrollCount=1, loopCount=10, aggregateFunction='min',
|
setNanoBenchParameters(config='', msrConfig=getDefaultCacheMSRConfig(), nMeasurements=10, unrollCount=1, loopCount=10, aggregateFunction='min',
|
||||||
basicMode=True, noMem=True)
|
basicMode=True, noMem=True)
|
||||||
|
|
||||||
ec = getCodeForAddressLists([AddressList([address],False,True)])
|
ec = getCodeForAddressLists([AddressList([address], False, True, False)])
|
||||||
nb = runNanoBench(code=ec.code, oneTimeInit=ec.oneTimeInit)
|
nb = runNanoBench(code=ec.code, oneTimeInit=ec.oneTimeInit)
|
||||||
|
|
||||||
nCacheLookups = [nb['CACHE_LOOKUP_CBO_'+str(cBox)] for cBox in range(0, getNCBoxUnits())]
|
nCacheLookups = [nb['CACHE_LOOKUP_CBO_'+str(cBox)] for cBox in range(0, getNCBoxUnits())]
|
||||||
@@ -258,6 +258,14 @@ def getCodeForAddressLists(codeAddressLists, initAddressLists=[], wbinvd=False,
|
|||||||
|
|
||||||
pfcEnabled = True
|
pfcEnabled = True
|
||||||
for addressList in addressLists:
|
for addressList in addressLists:
|
||||||
|
if addressList.wbinvd:
|
||||||
|
if addressList.exclude and pfcEnabled:
|
||||||
|
codeList.append(PFC_STOP_ASM + '; ')
|
||||||
|
codeList.append('wbinvd; ')
|
||||||
|
if addressList.exclude and pfcEnabled:
|
||||||
|
codeList.append(PFC_START_ASM + '; ')
|
||||||
|
continue
|
||||||
|
|
||||||
addresses = addressList.addresses
|
addresses = addressList.addresses
|
||||||
if len(addresses) < 1: continue
|
if len(addresses) < 1: continue
|
||||||
|
|
||||||
@@ -399,7 +407,7 @@ def parseCacheSetsStr(level, clearHL, cacheSetsStr):
|
|||||||
return cacheSetList
|
return cacheSetList
|
||||||
|
|
||||||
|
|
||||||
AddressList = namedtuple('AddressList', 'addresses exclude flush')
|
AddressList = namedtuple('AddressList', 'addresses exclude flush wbinvd')
|
||||||
|
|
||||||
# cacheSets=None means do access in all sets
|
# cacheSets=None means do access in all sets
|
||||||
# in this case, the first nL1Sets many sets of L2 will be reserved for clearing L1
|
# in this case, the first nL1Sets many sets of L2 will be reserved for clearing L1
|
||||||
@@ -411,7 +419,7 @@ def runCacheExperiment(level, seq, initSeq='', cacheSets=None, cBox=1, clearHL=T
|
|||||||
|
|
||||||
clearHLAddrList = None
|
clearHLAddrList = None
|
||||||
if (clearHL and level > 1):
|
if (clearHL and level > 1):
|
||||||
clearHLAddrList = AddressList(getClearHLAddresses(level, cacheSetList, cBox), True, False)
|
clearHLAddrList = AddressList(getClearHLAddresses(level, cacheSetList, cBox), True, False, False)
|
||||||
|
|
||||||
initAddressLists = []
|
initAddressLists = []
|
||||||
seqAddressLists = []
|
seqAddressLists = []
|
||||||
@@ -420,6 +428,10 @@ def runCacheExperiment(level, seq, initSeq='', cacheSets=None, cBox=1, clearHL=T
|
|||||||
for seqString, addrLists in [(initSeq, initAddressLists), (seq, seqAddressLists)]:
|
for seqString, addrLists in [(initSeq, initAddressLists), (seq, seqAddressLists)]:
|
||||||
for seqEl in seqString.split():
|
for seqEl in seqString.split():
|
||||||
name = getBlockName(seqEl)
|
name = getBlockName(seqEl)
|
||||||
|
if name == '<wbinvd>':
|
||||||
|
addrLists.append(AddressList([], True, False, True))
|
||||||
|
continue
|
||||||
|
|
||||||
wayID = nameToID.setdefault(name, len(nameToID))
|
wayID = nameToID.setdefault(name, len(nameToID))
|
||||||
exclude = not '?' in seqEl
|
exclude = not '?' in seqEl
|
||||||
flush = '!' in seqEl
|
flush = '!' in seqEl
|
||||||
@@ -428,7 +440,7 @@ def runCacheExperiment(level, seq, initSeq='', cacheSets=None, cBox=1, clearHL=T
|
|||||||
|
|
||||||
if clearHLAddrList is not None and not flush:
|
if clearHLAddrList is not None and not flush:
|
||||||
addrLists.append(clearHLAddrList)
|
addrLists.append(clearHLAddrList)
|
||||||
addrLists.append(AddressList(addresses, exclude, flush))
|
addrLists.append(AddressList(addresses, exclude, flush, False))
|
||||||
|
|
||||||
ec = getCodeForAddressLists(seqAddressLists, initAddressLists, wbinvd)
|
ec = getCodeForAddressLists(seqAddressLists, initAddressLists, wbinvd)
|
||||||
|
|
||||||
@@ -462,7 +474,7 @@ def findMinimalL3EvictionSet(cacheSet, cBox):
|
|||||||
if cacheSet in evSetForCacheSet:
|
if cacheSet in evSetForCacheSet:
|
||||||
return evSetForCacheSet[cacheSet]
|
return evSetForCacheSet[cacheSet]
|
||||||
|
|
||||||
clearHLAddrList = AddressList(getClearHLAddresses(3, [cacheSet], cBox), True, False)
|
clearHLAddrList = AddressList(getClearHLAddresses(3, [cacheSet], cBox), True, False, False)
|
||||||
addresses = []
|
addresses = []
|
||||||
curAddress = cacheSet*getCacheInfo(3).lineSize
|
curAddress = cacheSet*getCacheInfo(3).lineSize
|
||||||
|
|
||||||
@@ -476,7 +488,7 @@ def findMinimalL3EvictionSet(cacheSet, cBox):
|
|||||||
if not getCBoxOfAddress(curAddress) == cBox: continue
|
if not getCBoxOfAddress(curAddress) == cBox: continue
|
||||||
|
|
||||||
addresses += [curAddress]
|
addresses += [curAddress]
|
||||||
ec = getCodeForAddressLists([AddressList(addresses,False,False), clearHLAddrList])
|
ec = getCodeForAddressLists([AddressList(addresses, False, False, False), clearHLAddrList])
|
||||||
|
|
||||||
setNanoBenchParameters(config=getDefaultCacheConfig(), msrConfig='', nMeasurements=10, unrollCount=1, loopCount=100,
|
setNanoBenchParameters(config=getDefaultCacheConfig(), msrConfig='', nMeasurements=10, unrollCount=1, loopCount=100,
|
||||||
aggregateFunction='med', basicMode=True, noMem=True)
|
aggregateFunction='med', basicMode=True, noMem=True)
|
||||||
@@ -488,7 +500,7 @@ def findMinimalL3EvictionSet(cacheSet, cBox):
|
|||||||
for i in reversed(range(0, len(addresses))):
|
for i in reversed(range(0, len(addresses))):
|
||||||
tmpAddresses = addresses[:i] + addresses[(i+1):]
|
tmpAddresses = addresses[:i] + addresses[(i+1):]
|
||||||
|
|
||||||
ec = getCodeForAddressLists([AddressList(tmpAddresses,False,False), clearHLAddrList])
|
ec = getCodeForAddressLists([AddressList(tmpAddresses, False, False, False), clearHLAddrList])
|
||||||
nb = runNanoBench(code=ec.code, oneTimeInit=ec.oneTimeInit)
|
nb = runNanoBench(code=ec.code, oneTimeInit=ec.oneTimeInit)
|
||||||
|
|
||||||
if nb['L3_HIT'] < len(tmpAddresses) - 0.9:
|
if nb['L3_HIT'] < len(tmpAddresses) - 0.9:
|
||||||
@@ -499,7 +511,7 @@ def findMinimalL3EvictionSet(cacheSet, cBox):
|
|||||||
|
|
||||||
|
|
||||||
def findCongruentL3Addresses(n, cacheSet, cBox, L3EvictionSet):
|
def findCongruentL3Addresses(n, cacheSet, cBox, L3EvictionSet):
|
||||||
clearHLAddrList = AddressList(getClearHLAddresses(3, [cacheSet], cBox), True, False)
|
clearHLAddrList = AddressList(getClearHLAddresses(3, [cacheSet], cBox), True, False, False)
|
||||||
|
|
||||||
congrAddresses = []
|
congrAddresses = []
|
||||||
L3WaySize = getCacheInfo(3).waySize
|
L3WaySize = getCacheInfo(3).waySize
|
||||||
@@ -508,7 +520,7 @@ def findCongruentL3Addresses(n, cacheSet, cBox, L3EvictionSet):
|
|||||||
if not getCBoxOfAddress(newAddr) == cBox: continue
|
if not getCBoxOfAddress(newAddr) == cBox: continue
|
||||||
|
|
||||||
tmpAddresses = L3EvictionSet[:getCacheInfo(3).assoc] + [newAddr]
|
tmpAddresses = L3EvictionSet[:getCacheInfo(3).assoc] + [newAddr]
|
||||||
ec = getCodeForAddressLists([AddressList(tmpAddresses,False,False), clearHLAddrList])
|
ec = getCodeForAddressLists([AddressList(tmpAddresses, False, False, False), clearHLAddrList])
|
||||||
|
|
||||||
setNanoBenchParameters(config=getEventConfig('L3_HIT'), msrConfig=None, nMeasurements=10, unrollCount=1, loopCount=100,
|
setNanoBenchParameters(config=getEventConfig('L3_HIT'), msrConfig=None, nMeasurements=10, unrollCount=1, loopCount=100,
|
||||||
aggregateFunction='med', basicMode=True, noMem=True, verbose=None)
|
aggregateFunction='med', basicMode=True, noMem=True, verbose=None)
|
||||||
@@ -531,7 +543,7 @@ def findMaximalNonEvictingL3SetInCBox(start, stride, L3Assoc, cBox):
|
|||||||
if getCBoxOfAddress(curAddress) != cBox:
|
if getCBoxOfAddress(curAddress) != cBox:
|
||||||
clearHLAddresses.append(curAddress)
|
clearHLAddresses.append(curAddress)
|
||||||
curAddress += stride
|
curAddress += stride
|
||||||
clearHLAddrList = AddressList(clearHLAddresses, True, False)
|
clearHLAddrList = AddressList(clearHLAddresses, True, False, False)
|
||||||
|
|
||||||
curAddress = start
|
curAddress = start
|
||||||
while len(addresses) < L3Assoc:
|
while len(addresses) < L3Assoc:
|
||||||
@@ -547,7 +559,7 @@ def findMaximalNonEvictingL3SetInCBox(start, stride, L3Assoc, cBox):
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
newAddresses = addresses + [curAddress]
|
newAddresses = addresses + [curAddress]
|
||||||
ec = getCodeForAddressLists([AddressList(newAddresses,False,False), clearHLAddrList])
|
ec = getCodeForAddressLists([AddressList(newAddresses, False, False, False), clearHLAddrList])
|
||||||
|
|
||||||
setNanoBenchParameters(config=getEventConfig('L3_HIT'), msrConfig='', nMeasurements=10, unrollCount=1, loopCount=10,
|
setNanoBenchParameters(config=getEventConfig('L3_HIT'), msrConfig='', nMeasurements=10, unrollCount=1, loopCount=10,
|
||||||
aggregateFunction='med', basicMode=True, noMem=True)
|
aggregateFunction='med', basicMode=True, noMem=True)
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ def main():
|
|||||||
xValues.append(str(x))
|
xValues.append(str(x))
|
||||||
addresses = range(0, x, args.stride)
|
addresses = range(0, x, args.stride)
|
||||||
nAddresses.append(len(addresses))
|
nAddresses.append(len(addresses))
|
||||||
ec = getCodeForAddressLists([AddressList(addresses,False,False)], wbinvd=True)
|
ec = getCodeForAddressLists([AddressList(addresses, False, False, False)], wbinvd=True)
|
||||||
nbDicts.append(runNanoBench(code=ec.code, init=ec.init, oneTimeInit=ec.oneTimeInit))
|
nbDicts.append(runNanoBench(code=ec.code, init=ec.init, oneTimeInit=ec.oneTimeInit))
|
||||||
pt *= 2
|
pt *= 2
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user