0

我们有一个函数,strcpy,默认优化

 static void str_cpy( char *to, const char *from)
 {
      while( *from)
      {
            *to = *from;
            to = to + 1;
            from = from + 1;
      }
      *to = '\0';
  }

还有一个,matirsadd,高优化(3)

 void matrisadd( int res[MATRIXSIZE_ROWS][MATRIXSIZE_COLS],
                 int  a[MATRIXSIZE_ROWS][MATRIXSIZE_COLS],
                 int b[MATRIXSIZE_ROWS][MATRIXSIZE_COLS] )
 {
     int i,j;
     for(j=0; j < MATRIXSIZE; ++j)
         for(i=0; i < MATRIXSIZE; ++i)
             res[i][j] = a[i][j] + b[i][j];
 }

MATRIXSIZE(和 w/e)= 16

缓存大小为 128 字节,块大小为 8 字节,关联性为 1 为什么第一个函数在指令缓存中获得 86% 的命中率,而 matrisadd 在指令缓存中获得 99% 的命中率?

编辑:我们知道 str_cpy 每个循环包含 18 条汇编指令,并且缓存有 32 条指令的空间。因此,在我们将其加载到缓存中并利用时间局部性之前,这只会产生第一个“启动”-未命中。但是 matrisadd 会有同样必要的启动缺失,那么 str_cpy 中的额外缺失来自哪里?

解决方案:我们解决了它,与每个程序必须采取的循环数量有关......

4

0 回答 0