在C语言中,“stride”是什么意思,它如何使用?
通常而言,“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];
对于所有的 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倍。
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
for (long j = 0; j < ROWS; j++)
成为外部循环。 - Weather Vane