缓存,行主要和列主要

时间:2015-01-26 18:08:09

标签: c++ caching intel

我一直在测试按行主顺序对矩阵元素求和所需的时间差异

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。

enter image description here

x轴显示n,y轴显示sumation的时间(以纳秒为单位)除以v的大小(以字节为单位)。一切似乎都正常。两者之间的巨大差异开始于n = 850左右,矩阵的大小约为6MB,这正是我的L3缓存的大小。对于大n,列主要顺序比行主要顺序慢10倍。我对结果很满意。

我接下来要做的是在亚马逊网络服务上运行相同的程序,他们有一个E5-2670。以下是同一计划的结果。

enter image description here

列主要顺序比700&lt; = n&lt; = 2000的行主要顺序慢约10倍,但是对于n> = 2100,列主要顺序的每字节成本突然下降并且它是只比行主要订单慢2倍!!!有没有人对这种奇怪的行为有解释?

PS:对于有兴趣的人,可在此处获取完整代码:https://www.dropbox.com/s/778hwpuriwqbi6o/InsideLoop.zip?dl=0

0 个答案:

没有答案