为什么要初始化一个大小为2的幂的矩阵?

时间:2017-12-22 14:17:01

标签: c performance memory

这让我困惑了几个星期,没有人能够给出某种答案。把它作为圣诞礼物,请发布你可能有的任何解释......

我很高兴向学生们展示初始化矩阵(在C中)在完成时速度较慢"在列中明智"。

#define NB_TESTS 100
#define SIZE 512
int M[SIZE][SIZE];
for (int n=0; n<NB_TESTS; n++) {
    for (int i=0; i<SIZE; i++) {
        for (int j=0; j<SIZE; j++) {
            M[j][i] = 0;
        }
    }
}

比在循环中初始化M[i][j]的通常版本慢约3倍。

到目前为止一直很好......

这是第一个令人费解的观察。如果我更换

 #define SIZE 512

通过

#define SIZE 513

#define SIZE 511
差距消失了。

第二个更令人费解的令人费解的观察结果是,在这种情况下,通常的初始化效率不高。我会在2的权力中填补这一点很棒&#34;。 初始化的反转版本与正常版本一样快!

你对此采取了什么措施?

备注:

  • 我正在运行debian,

  • 同样的事情发生在gcc(6.3)和clang(3.8)

  • 在堆或堆栈中分配似乎没有什么区别

  • gcc / clang的优化选项没有什么区别(除了使两个版本更快)

  • 显然,所产生的集合并没有做任何奇怪的事情(同事说)

  • 对于更大的尺寸,正常初始化 更快。对于2的幂而言,反向初始化较慢(SIZE的{​​{1}})25%的奇怪事实仍然存在!

以下是我在测试大部分内容时使用的完整代码:

4096

0 个答案:

没有答案