2012-02-27 53 views
1

我需要儘量減少下面代碼中的拖動總量,任何人都可以快速查看並告訴我在哪裏投入我的努力? 我試過幾個性能比較分析,但結果無關..如何最小化下面代碼中的浮點運算

int twoDToOneD(int i, int j, int nRows) 
{ 
return j*nRows + i; 
} 

double* addMatrices(int m, int n, double* A, double* B, bool add) 
{ 
double* C = new double[m*n]; 
double* pA = A; 
double* pB = B; 
double* pC = C; 

int i = m*n; 

while(i--) 
{ 
    if(add) 
    { 
     *pC = *pA + *pB; 
    } else 
    { 
     *pC = *pA - *pB; 
    } 

    pC++; 
    pA++; 
    pB++; 
} 

return C; 
} 

感謝, 卓

+1

你不能使用SIMD的任何原因?並且看到這是全部基於矩陣的,它可能作爲GPGPU內核執行得最好。 – Necrolis 2012-02-27 10:35:31

+0

我可以在VS10中使用SIMD嗎? – user1235325 2012-02-27 10:42:07

+0

是的,你可以在任何版本的vc6上使用,更多關於你的目標平臺是否支持SSE1/2/3/4 – Necrolis 2012-02-27 10:49:04

回答

0

對,我沒看過每一個最後的線,但它看起來像你只是:

  1. 產生隨機整數
  2. 存儲它們作爲double小號
  3. 添加它們
  4. 加法和乘法他們

督察 - 我沒有看到任何使用部分在所有,並適當大小的整數將以上乘。如果是這樣的話,你可以刪除程序中的每一個FLOP;)

如果這不是一個準確的信號,你仍然可以在適當的範圍內使用它,然後將信號調高,存儲爲一個整數,然後帶在某些情況下,結果回到適當的範圍。

對於適當大小的多/加,使用整數將會更快並且可能需要更少的內存 - 您也可以對它們應用SIMD指令。除此之外 - 您改進的緩存局部性,最小化分支和最小化動態分配也可以使程序快幾倍。