我們有一個賦值給我們一個非常低效的程序,我們必須優化代碼以使其運行得更快。除了這兩個,我大部分都非常快,除了這兩個,我非常擔心,因爲它們非常簡單。一個基本上將二維數組中的所有值設置爲相同的值,並且基本上交換兩個二維數組的值。這就是問題所在。他們佔用了大部分時間,但因爲它們非常簡單,我無法弄清楚如何在不破壞功能的情況下減少它們。而且我知道可以讓他們跑得更快,因爲班上的其他學生一直在變得荒謬的加速。這兩個問題是:優化嵌套循環
fSetArray(int rows, int cols, float val)
{
int i, j;
F2D *out;
out = fMallocHandle(rows, cols);
for(i=0; i<rows; i++)
for(j=0; j<cols; j++)
subsref(out,i,j) = val;
return out;
}
唯一重要的部分是那裏的兩個循環。基本上,我們有一個具有一定寬度(行)和一定高度(cols)的二維數組,我們將所有值設置爲val。但是我無法消除其中一個循環(這將是加速它的最佳方式)。除非我錯過了一些明顯的東西。如果cols和rows是相同的數字,這會容易得多。
的另一個功能是:
fDeepCopy(F2D* in)
{
int i, j;
F2D* out;
int rows, cols;
rows = in->height;
cols = in->width;
out = fMallocHandle(rows, cols);
for(i=0; i<rows; i++)
for(j=0; j<cols; j++)
subsref(out,i,j) = subsref(in,i,j);
return out;
}
的出數組總是比數組較大,所以我們不必擔心溢出或此類。這個函數基本上只是交換了兩個數組的值,但再一次,因爲它非常簡單,我不能完全理解它。
而且有人說並行,因爲樣本量和服務器,創建線程所需的開銷,其實之前減慢程序。我試過了。由於這兩個函數太短,所以不值得創建線程才能在一個並行之後殺死它們。
但供參考,是在技術上這是一個OpenMP的項目,我們應該使用並行,但對於這兩個函數,這樣做實際上會減慢整個程序。我用一個並行for循環來檢查。
編輯:感謝大家誰給我出出主意!我已經掌握了它,並且全速奔跑!
嘗試交換循環順序 - 它可能會影響緩存命中率。 – dasblinkenlight
如何定義subsref?這很可能是一個宏,但如果它是一個函數,確保它被內聯。或將其重寫爲宏。 –
您需要包含更多細節,特別是關於F2D結構和子參數函數。 – betabandido