2012-02-22 55 views
2

我正在解決3個不同的線性方程組,其中每個系統都取決於前一個的結果。它們都有一些係數,然後和前面的結果一起定義新的系統(當然除了第一個系統由它自己定義)。優化重複係數評估

的代碼是有點像這樣:

vector<double>point(n);//initialized to values 
vector<double>A(n*n,0); 
vector<double>b(n,0); 
double coefficient; 

for(int i=0;i<n;i++){ 
    for(int j=0;j<n;j++){ 
    coefficient=myCoeff(point[i],point[j]); 
    //A[i+j*n] and b[j] initialized using coefficient 
    } 
} 

vector<double>x(n) //initialized as solution of A\b 

for(int i=0;i<n;i++){ 
    for(int j=0;j<n;j++){ 
    coefficient=myCoeff(point[i],point[j]); 
    //A[i+j*n] and b[j] initialized using coefficient and x 
    } 
} 
//x=A\b 
//and so on for the third system 

仿形代碼顯示的80%的時間被用於調用myCoeff。優化myCoeff超出了我的興趣。

我在腦海中有兩個選項: - 將係數寫入文件一次並將其讀取兩次 -use parallel_for而不是outer for循環。

是否可以結合這兩個選項? 歡迎任何其他建議,如果您需要更多關於我可以提供的代碼的詳細信息。

回答

1

使用parallel_for時,以並行化循環(無論是外部的一個或兩個)的樣子,因爲調用myCoeff一個好主意,似乎是昂貴的。

然而,將所有係數文件系統可能不是一個很好的主意,因爲文件系統I/O往往是非常昂貴的,破壞你的程序的執行流程。如果你可以支付額外的N * N的存儲,它可能是更好的存儲係數存儲:

vector<double> coeff(n*n, 0); 
for (i...) { 
    for (j...) { 
    coeff[j+n*i] = myCoeff(point[i],point[j]); 
    } 
} 

這可以很容易地與循環並行化相結合。

如果你堅持你的文件系統中的存儲係數的想法(也許能夠減少內存使用),只使用一個文件,使得並行化非常困難的(文件意味着要sequencially訪問)。相反,您可能需要在矩陣中每行創建一個文件。這樣,您可以輕鬆地將係數存儲與外部循環的並行化結合起來。

此外,你可能會更好用線存儲的係數矩陣:A [1 * N + J]或反轉的i和j循環。

+0

我實際上正在考慮這種方法。這些係數實際上是4,所以這會使得5 * n * n,而最大的n將是現在的0.4-0.5左右,但可能已經足夠了。關於A的索引你是對的,我一開始就這樣做,在隨後的糾正中事情變得混亂。 – MarcoS 2012-02-22 13:55:15

+0

@MarcoS如果您有多個係數並將它們存儲在內存中,請確保將與相同(i,j)對相關的所有4個係數(例如,將它們分組在結構中並存儲矢量),而不是每個係數有一個n * n矩陣。 – Francesco 2012-02-22 14:56:30

+0

很好的建議,謝謝 – MarcoS 2012-02-22 20:48:52