2013-07-29 47 views
2

我正在使用Intel MKL庫來解決具有多個右手邊(rhs)向量的線性方程組(A*x = b)的系統。 rhs矢量是異步生成的,並通過一個單獨的例程生成,因此,不可能一次解決它們。在mkl_dss_solve的幾個實例中使用一個LU因子分解

爲了加速程序,使用多線程程序,其中每個線程負責解決單個rhs向量。由於矩陣A始終保持不變,所以LU分解應該執行一次,並且所有線程中都會使用這些因子。所以,我用下面的命令

dss_factor_real(handle, opt, data); 

因素A和句柄傳遞給線程解決使用以下命令的問題:

dss_solve_real(handle, opt, rhs, nRhs, sol); 

不過,我發現它不是線程安全的在dss_solve_real的幾個實例中使用相同的handle。顯然,出於某種原因,MKL庫更改會在每個創建競爭條件的實例中處理。我閱讀了MKL手冊,但找不到任何相關內容。由於將每個線程分解爲A是不合邏輯的,因此我想知道是否有任何方法可以解決此問題,並且在任何地方都使用相同的handle

在此先感謝您的幫助

回答

1

據我瞭解DSS界面,handle並不只包含LU分解,還包括其他的數據結構,使用和修改dss_solve_real;這是設計的,所以你應該使用鎖定機制來避免多個線程在同一個handle上同時調用dss_solve_real

此外,你假設dss_solve_real是串行的(否則我不明白爲什麼你應該同時調用它的多個實例)可能是錯誤的。 DSS是PARDISO求解器的一個接口,它應該在所有階段並行,而不僅僅是分解。

編輯

放棄了DSS界面並調用直接PARDISO,應該可以有很多線程以串行方式解決每一個RHS。 (不容易,但仔細編程它應該是可能的...)

然而,從最大吞吐量(單位時間解決的rhs)而不是最小延遲(單個rhs解決之前的時間) )我認爲最好的方法是有一個工作線程,通過一次調用並行求解器來解決在隊列中等待的所有rhs。當然,隊列的組織方式應使得rhs矢量存儲在連續的存儲區中。

+0

謝謝您的意見。我不做任何假設(串行或並行)。事實上,RHS載體異步進入隊列。每當RHS矢量準備就緒時,就會使用免費的工作者(線程)來解決該特定RHS矢量的問題。現在我確信dss_solve_real確實改變了句柄。如果我想鎖定句柄,使用線程將沒有任何理由。 – Pouya

+0

查看我的編輯:我仍然認爲有很多線程可以解決rhs效率不高的問題,即使您可以強制連續解決問題的階段。 –