在I/O跟踪文件中查找缓存未命中和命中率

3

我有一个I/O跟踪文件,其中包含以下字段('asu'、'block_address'、'size'、'opcode'和'time_stamp')。数据看起来像这样(超过500万行)。

0,20941264,8192,W,0.551706
0,20939840,8192,W,0.554041
0,20939808,8192,W,0.556202
1,3436288,15872,W,1.250720
1,3435888,512,W,1.609859
1,3435889,512,W,1.634761
0,7695360,4096,R,2.346628
1,10274472,4096,R,2.436645
2,30862016,4096,W,2 448003
2,30845544,4096,W,2.449733
1,10356592,4096,W,2.449733 

我正在尝试在我的项目中添加缓存层并希望计算命中和未命中次数。我使用@functools.lru_cache(maxsize = None)查找块地址的缓存命中和未命中情况。遵循教程,我尝试计算未命中/命中情况。blk_trace是用于块地址的跟踪数组。

@functools.lru_cache(maxsize = None)
def blk_iter():
    blk_len = len(blk_trace)
    for i in range(0,blk_len):
        print(blk_trace[i])

查看缓存信息blk_iter.cache_info(),我得到了CacheInfo(hits=0, misses=1, maxsize=None, currsize=1) ,但这不正确。 我对Python和缓存概念都比较陌生,不知道我做错了什么。 如何找到块地址的未命中/命中情况?


ASU是应用特定单元。 - srikarpv
缓存是为函数blk_iter而设的--您只调用了一次blk_iter,因此您的缓存大小为1,并且有一个未命中。此外,函数的返回值是被缓存的内容,而不是它所打印的内容。 - sytech
1个回答

3
缓存是为函数blk_iter而设的--你只调用了一次blk_iter,因此您的缓存大小为1,它有一次未命中。
考虑下面使用lru_cache的函数。
@lru_cache(maxsize=None)
def myfunc(x):
    print('Cache miss: ', x)
    return x + 1

当使用特定的 x 值调用该函数时,该函数将运行并将结果存储在缓存中。如果再次使用相同的参数调用该函数,则该函数将不会运行,而是返回缓存的值。
>>> for i in range(3):
...     print(myfunc(i))
...
Cache miss:  0
1
Cache miss:  1
2
Cache miss:  2
3
>>> myfunc(0) # this will be a cache hit
1
>>> myfunc(3) # this will be another miss
Cache miss:  3
4
>>> myfunc.cache_info()
CacheInfo(hits=1, misses=4, maxsize=None, currsize=4)   

在您的示例中,即使高速缓存设置正确,您仍将面临所有未命中和没有命中的情况。无论如何,for i in range(0,blk_len):每次迭代都会使用新的参数调用,因此高速缓存永远不会命中。

有没有一种方法可以为blk_trace设计缓存? 比如将地址附加到列表中并将列表传递给我的函数。`l = [1,2,3] #块地址列表 @lru_cache(maxsize=None) def stuff(a): for x in a: print astuff(l)` - srikarpv
你可以这样做,但正如我所提到的,如果你要做的只是 for i in range(blk_len): func(i),那么这只会导致100%的结果都是缓存未命中,因为每次 i 都会不同。此外,如果你确实有缓存命中,函数将不会运行(因此内部的打印语句也不会输出任何内容)。你希望通过缓存实现什么目的? - sytech
我正在尝试使用seq2seq tensorflow模型来预测块IO序列。 缓存是一个监视和跟踪地址的层。 这个想法是通过预取来加速应用程序性能。 - srikarpv
很遗憾,我对tensorflow不是很熟悉。如果您可以创建一个名为get_data(address)的函数来执行获取地址数据的昂贵操作,那么可能可以使用lru_cache;之前获取过的任何地址都可以在没有昂贵工作的情况下再次获取,因为结果将被缓存。但是每个地址至少需要获取一次。我认为lru_cache可能不是您的用例的最佳选择。请考虑提出一个与tensorflow和相关代码有关的单独问题。 - sytech
非常感谢您的解释和指导,@sytech。我很感激 :) - srikarpv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接