在使用优化的内存带宽方法时,我没有看到性能提升

时间:2014-09-15 08:55:48

标签: c traversal memory-bandwidth

我看到了一个循环的例子,它应该比之后的循环慢:

for (i = 0; i < 1000; i++) 
   column_sum[i] = 0.0;
     for (j = 0; j < 1000; j++)
        column_sum[i] += b[j][i];

与此相比:

for (i = 0; i < 1000; i++)
     column_sum[i] = 0.0;
for (j = 0; j < 1000; j++)
     for (i = 0; i < 1000; i++)
        column_sum[i] += b[j][i];

现在,我编写了一个工具来测试不同索引号的数量,但是在我尝试这个概念后,我没有看到很多性能优势,我担心我的代码与它有关...

应该是在我的代码中运行的较慢的循环:

    for (i = 0; i < val; i++){
        column_sum[i] = 0.0;
        for (j = 0; j < val; j++){
            int index = i * (int)val + j;
            column_sum[i] += p[index];
        }
    }

应该是“显着”更快的代码:

    for (i = 0; i < val; i++) {
        column_sum[i] = 0.0;
    }
    for (j = 0; j < val; j++) {
        for (i = 0; i < val; i++) {
            int index = j * (int)val + i;
            column_sum[i] += p[index];
        }
    }

数据比较:

enter image description here

1 个答案:

答案 0 :(得分:0)

我对循环中的索引值感到困惑:int index = j * (int)val + i;

较慢的循环:

    for (i = 0; i < val; i++) {
        column_sum[i] = 0.0;
        for (j = 0; j < val; j++){
            int index = j * (int)val + i;
            column_sum[i] += p[index];
        }
    }

更快的循环:

    for (i = 0; i < val; i++) {
        column_sum[i] = 0.0;
    }
    for (j = 0; j < val; j++) {
        for (i = 0; i < val; i++) {
            int index = j * (int)val + i;
            column_sum[i] += p[index];
        }
    }