我们有一个函数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?
解决方案: 我们解决了它,与每个程序必须采取的循环量有关...