c中的步幅是什么
What is stride in c
我是 C 的新手,在我学习 Python 之前,这就是为什么我不知道 stride 是什么以及如何在代码中使用它们的原因。
这个问题找到答案。谢谢@Eric Postpischil
通常,步幅是步数通过某物的距离。
在 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]
的大小,即 short
的 COLS
(2000) 个元素(可能是两个字节),因此可能是 4000 字节。所以步幅是 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 倍。
我是 C 的新手,在我学习 Python 之前,这就是为什么我不知道 stride 是什么以及如何在代码中使用它们的原因。
这个问题找到答案。谢谢@Eric Postpischil
通常,步幅是步数通过某物的距离。
在 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]
的大小,即 short
的 COLS
(2000) 个元素(可能是两个字节),因此可能是 4000 字节。所以步幅是 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 倍。