What is stride in c

3
在C语言中,“stride”是什么意思,它如何使用?

2
在位图图像中,步幅是数组的实际宽度,可以大于图像的宽度。 - Weather Vane
2
也许老师指的是通过数组访问遍历内存的方式。循环是按列,行进行的,这可能比按行、列更容易出现缓存未命中。因此,要交换嵌套循环的顺序,使 for (long j = 0; j < ROWS; j++) 成为外部循环。 - Weather Vane
2
如果这是一个编程课的练习,也许可以采用记忆化技术(在第一次计算后保存结果以供后续迭代使用)来解决问题? - PhilMasteG
1
嗯,实际上仔细想想,你从来没有说过你的老师要求运行代码。如果你在谷歌上搜索“C编程步幅”,你会在微软文档中找到有关“步幅”及其如何确定的定义。所以,实际上不需要优化,我猜? - PhilMasteG
1
如果您不知道在此上下文中“stride”是什么意思,请查阅。这是关于计算机的,涉及到数组,因此其含义是数组的步幅 - Gilles 'SO- stop being evil'
显示剩余5条评论
1个回答

9

通常而言,“stride”指的是步骤穿过某个物体的距离。

在“addition”程序中,我们有以下循环:

for (long i = 0; i < COLS; i++)
        for (long j = 0; j < ROWS; j++) {
            sum += table[j][i];
        }

在内部循环的连续迭代中,当第一次迭代中 j 等于 x 时,其中一个迭代访问了 table[x][i],下一个迭代访问了 table[x+1][i]。这两个访问之间的距离是一个 table[j] 的大小,它是 COLS (2000)个 short 元素(大约为两个字节),所以可能是 4000 字节。因此,步幅为 4000 字节。
这通常对典型处理器上的缓存内存不利,因为缓存内存主要设计用于相邻的内存访问(小步幅)。这是程序运行速度较慢的原因。
由于循环中的操作 sum += table[j][i]; 对于所有的 ij,无论执行顺序如何都是独立的,因此我们可以通过交换两个 for 语句来轻松解决这个问题:
    for (long j = 0; j < ROWS; j++)
        for (long i = 0; i < COLS; i++)
            sum += table[j][i];

接下来,内部循环的连续迭代将访问 table[j][x]table[j][x+1],它们具有一次short(即两个字节)的步幅。

在我的系统上,使用这种改变后,程序的运行速度大约快了20倍。


谢谢你提供的信息,你的代码使我的代码从12秒降到了8秒。你能让我的代码再更快一些吗? - codester_09
1
稍微快一点可能是:long addition(short table[][COLS]) { long sum = 0; short *p = &table[0][0]; short *end = &table[ROWS-1][COLS-1]; while (p < end+1) {sum += *p++;} return sum;}。并提高编译器的优化级别,例如gcc -O2。 - Franck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接