首先,我知道有很多用于矩阵乘法的算法。对于这个问题,我将考虑以下内容:
算法A:
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
prod[i][j] = 0;
for(k = 0; k < N; k++)
prod[i][j] += mat1[i][k] * mat2[k][j]
}
}
算法B:
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
temp = 0;
for(k = 0; k < N; k++)
temp += mat1[i][k] * mat2[k][j]
prod[i][j] = temp;
}
}
同事和我都同意算法B
优于(运行时间更快)算法A
。但是,我们对B
表现更好的原因有不同的推理。
第一个理论是因为我们在最内层循环中替换C[i][j]
,所以我们执行N 3 较少的指针算术运算,从而导致我们的改进。
第二个理论是因为我们在最内层循环中替换C[i][j]
,所以我们执行N 3 更少的内存访问,从而导致我们的改进。
问题是:
如何设置实验以隔离这些因素中的每一个,以根据经验确定哪一个(如果有的话)对运行时间有更大的影响?