CS:APP Cache Lab

实验材料
开始依然是一脸懵逼,看了两遍Writeup大概明白要干啥了。整个实验分为两大部分,第一部分是实现一个缓存模拟器,第二个部分是优化矩阵运算。

Part A:Writing a Cache Simulator

给出一系列对于内存的读写,需要实现一个缓存模拟器计算缓存命中,未命中和替换的总次数,还给了一个标准的程序来对答案。

  1. 每次操作的类型为LSM中的一种,分别为读取,存储和改变,其中M相当于先LS。仔细分析,在我们的模拟器中LS没有本质的区别,所以这些操作最后都化为同一种操作,只不过M要做两次这样的操作。
  2. 要求的替换算法是LRU,也就是最近最少使用策略,主要有两种实现方式,一种是维护一个时间戳,每次访存暴力找到距离最长的块进行替换,然后暴力更新其他时间戳。另外一个是维护一个队列,每个块保存一个指针指向,同时还要保存前驱的后继,每次访存维护这个队列。显然前一种复杂度高,但是好写。
  3. 缓存可以看作是一个二维数组cache[S][E],在动态分配内存时,可以分配一个一维数组也可以分配一个二维数组,本质是一样的。

PPT上还给了一些其他帮助,比如如何读取命令行参数等等。除此以外就没什么需要注意的点了,完全可以当一道模拟题去写。
我这里偷了个懒,按照固定的格式去读取参数,使用时间戳的暴力算法进行模拟,最后是写了100行不到完成了这个实验。

下面是代码:

#include "cachelab.h"
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    unsigned int tag, time, valid;
} line;

int s, E, b;
int hits, misses, evictions;
line *cache;

void Simulate(unsigned int address)
{
    unsigned int tag = address >> s;
    unsigned int id = address - (tag << s);

    int i, hitPos = -1, validPos = -1, lruPos = -1;
    unsigned int lruValue = 0;
    for (i = id * E; i < id * E + E; i++)
    {
        if (cache[i].valid && cache[i].tag == tag)
            hitPos = i;
        else if (!cache[i].valid)
            validPos = i;
        if (cache[i].time >= lruValue)
        {
            lruValue = cache[i].time;
            lruPos = i;
        }
    }

    if (hitPos != -1)   // hit stage
    {
        hits++;
        for (i = id * E; i < id * E + E; i++)
            cache[i].time = (i == hitPos ? 0 : cache[i].time + 1);
        return;
    }

    misses++;           // miss stage
    if (validPos != -1)
    {
        cache[validPos].tag = tag;
        cache[validPos].valid = 1;
        for (i = id * E; i < id * E + E; i++)
            cache[i].time = (i == validPos ? 0 : cache[i].time + 1);
        return;
    }

    evictions++;        // eviction stage
    cache[lruPos].tag = tag;
    for (i = id * E; i < id * E + E; i++)
        cache[i].time = (i == lruPos ? 0 : cache[i].time + 1);
}

int main(int argc, char *argv[])
{
    s = atoi(argv[2]);  // get parameters
    E = atoi(argv[4]);
    b = atoi(argv[6]);

    cache = (line *)calloc(sizeof(line), (1 << s) * E);
    FILE *inputFile = fopen(argv[8], "r");

    char buffer[256];
    while (fgets(buffer, 256, inputFile))
    {
        if (buffer[0] == 'I')
            continue;

        unsigned int address = 0;
        int id = 3;
        while (buffer[id] != ',')
        {
            address *= 16;
            address += isalpha(buffer[id]) ? buffer[id] - 'a' + 10 : buffer[id] - '0';
            id++;
        }
        address >>= b;

        Simulate(address);
        if (buffer[1] == 'M')
            Simulate(address);
    }

    printSummary(hits, misses, evictions);
    fclose(inputFile);
    free(cache);
    return 0;
}

运行结果:

dyume@LAPTOP-LLU88NPC:/mnt/c/Users/dy199/Desktop/cpp/CsappHomework/cachelab$ ./test-csim
                        Your simulator     Reference simulator
Points (s,E,b)    Hits  Misses  Evicts    Hits  Misses  Evicts
     3 (1,1,1)       9       8       6       9       8       6  traces/yi2.trace
     3 (4,2,4)       4       5       2       4       5       2  traces/yi.trace
     3 (2,1,4)       2       3       1       2       3       1  traces/dave.trace
     3 (2,1,3)     167      71      67     167      71      67  traces/trans.trace
     3 (2,2,3)     201      37      29     201      37      29  traces/trans.trace
     3 (2,4,3)     212      26      10     212      26      10  traces/trans.trace
     3 (5,1,5)     231       7       0     231       7       0  traces/trans.trace
     6 (5,1,5)  265189   21775   21743  265189   21775   21743  traces/long.trace
    27

TEST_CSIM_RESULTS=27

顺利通过。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容