我一直在测试按行主顺序对矩阵元素求和所需的时间差异
std::vector<double> v( n * n );
// Timing begins
double sum{ 0.0 };
for (std::size_t i = 0; i < n; i++) {
for (std::size_t j = 0; j < n; j++) {
sum += v[i * n + j];
}
}
// Timing ends
以及列主要顺序
std::vector<double> v( n * n );
// Timing begins
double sum{ 0.0 };
for (std::size_t j = 0; j < n; j++) {
for (std::size_t i = 0; i < n; i++) {
sum += v[i * n + j];
}
}
// Timing ends
代码已用
编译g++ -std=c++11 -Ofast -fno-tree-vectorize -DNDEBUG main.cpp -o main
我们预计行主要订单(蓝色)的时间明显快于列主要订单(黄色)。如果我绘制运行此算法所需的时间(以纳秒为单位)除以数组的字节大小,我在计算机上得到以下图表,其中包含core-i7。
x轴显示n,y轴显示sumation的时间(以纳秒为单位)除以v的大小(以字节为单位)。一切似乎都正常。两者之间的巨大差异开始于n = 850左右,矩阵的大小约为6MB,这正是我的L3缓存的大小。对于大n,列主要顺序比行主要顺序慢10倍。我对结果很满意。
我接下来要做的是在亚马逊网络服务上运行相同的程序,他们有一个E5-2670。以下是同一计划的结果。
列主要顺序比700&lt; = n&lt; = 2000的行主要顺序慢约10倍,但是对于n> = 2100,列主要顺序的每字节成本突然下降并且它是只比行主要订单慢2倍!!!有没有人对这种奇怪的行为有解释?
PS:对于有兴趣的人,可在此处获取完整代码:https://www.dropbox.com/s/778hwpuriwqbi6o/InsideLoop.zip?dl=0