在学习 Python 之前,我是 C 的新手,这就是为什么我不知道什么是 stride 以及如何在代码中使用它们。
这个问题找到了答案。谢谢 @ Eric Postchil
一般来说,步幅是通过某物的距离。
在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 字节
这通常对典型处理器上的缓存内存不利,因为缓存内存主要是为彼此接近的内存访问(小步幅)而设计的。这是程序性能缓慢的原因。
由于循环中的操作sum += table[j][i];
与所有i
和j
的执行顺序无关,因此我们可以通过交换两个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 倍。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(82条)