• 斐波那契
    2019-07-19
    一般二维数组在内存中存放是按行优先存放的 所以在加载数据时候就会把一行数据加载进cache里 这样cache的命中率就大大提高 如果按列迭代 cache就很难名字从而cpu就要经常从内存中读数据 如果数据量不大的话两种方式可能没什么感觉 一旦数据量很大的话按行迭代的速度就能感觉出来了
     1
     15
  • coldpark
    2019-10-03
    请问如果5号高速缓存块要同时存储5和21号内存的数据,组标记怎么填写呢?
     1
     1
  • J.D.
    2019-10-03
    图里 Cache Line 0 ~ Cache Line 8 不是 9 个内存块吗?
     1
     1
  • Giacomo
    2019-08-04
    老师我想问一下,我记得之前我们学过,内存里有分段和分页,那这里的分块和之前的页有没有什么关系?
     2
     1
  • Geek_JaneJane
    2019-07-20
    请问徐老师,为什么我在Python上执行3行小程序不是那个效果呢?
    ```
    import time

    a = [0]*64*1024*1024
    start = int(time.time()*1000)
    for i in range(0, len(a)):
        a[i] *= 3
    print '1,', int(time.time()*1000) - start

    start = int(time.time()*1000)
    for j in range(0, len(a), 16):
        a[j] *= 3
    print '2,', int(time.time()*1000) - start

    输出:
    1, 11804
    2, 538

    ```
    展开
     3
     1
  • alexgzh
    2019-07-20
    分語言, 有的語言二維數組按照行來存, 例如C++ A[2][2] 存放是A[0][0] A[0][1] 存第一行。A[1][0] A[1][1] 存第二行,按照行迭代的方式快。Fortran按照列來存,按照列迭代快。
     1
     1
  • Hash
    2019-12-23
    我的电脑测试的结果
     int[][] arr = new int[10000][10000];
    按行迭代——
    280毫秒
    按列迭代——
    1180毫秒

    分析原因——
    1、首选数组的存储方式是连续的,在内存中是按照行来存储的,遍历的时候也是一个一个的往后遍历

    2、根据老师讲的,CPU从内存读取数据到CPU Cache ,是按照一小块一小块的方式读取的,它的物理内存是连续的,几乎是同行不同列,如果说我们是按照列来迭代的话,那么就会导致存储快无法使用,我们就不得不从内存中读取数据,而在内存中直接读取数据和从高速缓存中直接读取数据的效率那可不是一般的差距,所以说按照行来迭代话,我们就可以很好的利用的数据块,从高速缓存中来读取数据,从而所花费的时间也就比按照列来迭代所花费的时间少!

    这是我的见解,有不对的地方,还望老师指正!
    展开

    作者回复: Hash同学,

    你好,理解正确!

    
    
  • once
    2019-12-19
    老师你好 第17章中你对cpu cycle的定义是 所以我们一般把从内存里面读取一条指令的最短时间,称为 CPU 周期。 但是这章里说内存访问一般需要120个cpu cycle。感觉我对cpu周期的概念又含糊不清了
    
    
  • 随心而至
    2019-10-22
    讲的非常透彻赞。
    课后习题,由于二维数组在内存中是按照行存放的。按行遍历,下一条数据大概率在Cache line中,因而耗时较短。
    public class ArrCacheLineTest {
        public static void main(String[] args){
            int[][] arr = new int[6400][6400];
            long start = System.currentTimeMillis();
            int sum = 0;
            for(int i=0; i<arr.length; i++){
                for(int j=0; j<arr[i].length; j++){
                   sum += arr[i][j];
                }
            }
            //31ms, 由于数据是按照行放的,按行遍历,下一条数据大概在Cache line中,因而耗时较短。
            System.out.println("sum "+ sum +" time ="+(System.currentTimeMillis() - start));
            for(int i=0; i<arr.length; i++){
                for(int j=0; j<arr[i].length; j++){
                    sum += arr[j][i];
                }
            }
            //1610
            System.out.println("sum "+ sum +" time ="+(System.currentTimeMillis() - start));
        }
    }
    展开
    
    
  • gogo
    2019-10-20
    老师 那volatile的作用 是不是就是把cache中的有效位 置为0了呢?

    恳请老师解答! 谢谢老师!
     1
    
  • Fstar
    2019-09-27
    有点像哈希表。那如果读取的多个内存数据的地址都指向同一个缓存块怎么办?直接覆盖掉?

    作者回复: Fstar同学你好,

    37和38讲里讲了怎么做组相连的缓存加载过程,后面的MESI协议部分里也有怎么做写入的高速缓存同步问题,可以仔细看一下。

    
    
  • 小先生
    2019-09-19
    我有个疑问:
    内存中读取数据,也是按照一块一块来的。
    那一个内存地址是怎么存储对应字的位置偏移量。那它得存多少偏移量啊?

    作者回复: 小先生同学,

    你好,偏移量是在内存地址的访问请求里的,并不会存在映射关系里,不需要预先存啊。

     1
    
  • 活的潇洒
    2019-09-02
    “对自己狠一点,发现还是有潜力可挖”

    day37 天笔记:https://www.cnblogs.com/luoahong/p/11359393.html
     1
    
  • 焰火
    2019-09-01
    精妙~~
    
    
  • coder
    2019-07-20
    徐老师,你好,请教您一个问题:对于指令跟数据分开的哈弗架构,数据cache按照文中提的那几种方式很好理解,
    那么指令cache也是按照全相联,组相联的方式管理的吗?
    
    
  • 南山
    2019-07-20
    按行,1,空间局部性。2,提高使用cache line命中率
    时间就是金钱!!!
    
    
  • 许童童
    2019-07-19
    老师你好,内存地址的表示形式可以说一下吗,不是还有操作系统的虚拟内存地址吗,这一块是怎么直接映射的?
     1
    
  • gigglesun
    2019-07-19
    比如我有一个int变量的地址,假设是32位,去取它的值,怎么从缓存获得?这个过程是什么,感觉缺了offset的信息呀
    
    
  • humor
    2019-07-19
    按行快,按行可以充分利用CPU cache一次加载的内存,按列的话CPU cache利用率比较低。一次加载16个整数,速度大概相差16倍吧
    
    
  • Linuxer
    2019-07-19
    有一个问题请教,要表示cache的索引和偏移3个位不够啊,至少要七位啊
    
    
我们在线,来聊聊吧