我是 C 新手,在我學習 Python 之前,這就是為什么我不知道 stride 是什么以及如何在代碼中使用它們。
/* assignment 4 part B */
#include <stdlib.h> // for rand and srand
#include <stdio.h> // for printf
#include <time.h> // for time
// PLEASE DON'T CHANGE THESE DEFINES!
#define ROWS 2000
#define COLS 2000
long addition(short table[][COLS]) {
long sum = 0;
for (long i = 0; i < COLS; i )
for (long j = 0; j < ROWS; j ) {
sum = table[j][i];
}
return sum;
}
/*
void printTable(short table[][COLS]) {
for (int i = 0; i < COLS; i ) {
for (int j = 0; j < ROWS; j )
printf("%d ", table[j][i]);
printf("\n");
}
}
*/
// PLEASE DON'T CHANGE THIS FUNCTION!
void createTable(short table[][COLS]) {
for (int i = 0; i < COLS; i ) {
for (int j = 0; j < ROWS; j ) {
short number = (rand() % 10) 1;
table[j][i] = number;
}
}
}
int main() {
short table[ROWS][COLS];
srand((unsigned int)time(0));
createTable(table);
//printTable(table);
long sum = 0;
for (int i = 0; i < 1000; i ) {
sum = addition(table);
}
printf("sum is %ld\n", sum);
return 0;
}
有一些說明:
● 在 GCC 中編譯沒有錯誤。
● 程式運行沒有運行時錯誤
● 不更改注釋指示不更改的代碼。
●for對于所有運行,回圈運行的次數相同。
● 總和準確
如果我正在運行此代碼,那么這需要超過 1 分鐘才能執行,我的老師說除了加法功能之外不要更改任何內容。他們說。
另外,查看附加函式中的嵌套回圈并記下訪問此陣列的步幅
我的主要目標是如何比第一個更快地執行此代碼>
uj5u.com熱心網友回復:
通常,步幅是通過某物所走的距離。
在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]。這兩個訪問之間的距離是 one 的大小table[j],它是COLS(2000)個元素short(可能是兩個位元組),所以可能是 4000 個位元組。所以步幅是 4000 位元組。
這通常對典型處理器上的高速快取不利,因為高速快取主要設計用于彼此靠近的記憶體訪問(小步幅)。這是程式性能緩慢的原因。
由于回圈中的操作 , 與所有andsum = table[j][i];的執行順序無關,我們可以通過交換兩個陳述句輕松解決這個問題:ijfor
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],其步長為 1 short,可能是兩個位元組。
在我的系統上,這個改變后程式的運行速度提高了大約 20 倍。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/485101.html
下一篇:在鏈表中插入節點
