2012-04-13 40 views
1

我有一個程序需要找到3x3矩陣的特徵值和特徵向量數百萬次。我剛剛轉而使用LAPACK的zheev(是的,它們是厄密矩陣),並且該程序在特定情況下運行約1分20秒。我已經將我的算法與OpenMP並行化(正如我們之前所做的那樣),突然我的程序在大約9米處運行。我給zheev打了個電話,我的程序運行時間爲9s。由於LAPACK,使用OpenMP編程較慢

我在網上看了一圈,發現(據我所知),你可以編譯你的BLAS庫來使用OpenMP,但我不認爲這是這裏的問題。

不幸的是,這段代碼來自我的工作,我沒有將lapack安裝在默認位置,我不知道編譯時使用了哪些編譯器選項。這也使我很難編制一個最低限度的測試程序來證明這個問題。

對這個問題可能有什麼想法?

編輯:

我剛剛發現,使用OpenMP zheev失敗,這在它運行的速度較慢可能的聯繫。我已經讀過LAPACK中的一些例程不是線程安全的(或者它們具有線程安全變體),我如何才能知道zheev是否正在調用其中的一個例程,我可以改變它嗎?

+0

該程序需要多長時間連續運行調用'zheev'註釋掉?另外:你在哪個平臺上使用LAPACK和BLAS? – 2012-04-13 15:01:30

+0

@StephenCanon好點,它需要大約23秒,OpenSuSe 12與LAPACK 3.2.1,並且據我所知,它隨附的BLAS – SirGuy 2012-04-13 15:04:39

+0

LAPACK 3.2.1應該是線程安全的,除了您可能需要調用'dlamch在並行執行開始之前''和'slamch'。 – 2012-04-13 15:31:55

回答

4

暫且拋開您的OpenMP問題,如果您的代碼對性能敏感,您可能不想使用LAPACK來查找3x3矩陣的特徵值和特徵向量; LAPACK針對「大」問題。更重要的是,對於維數小於5的矩陣的特定情況,可以直接計算特徵值,因此可以使用比用於一般矩陣(其必然需要迭代)更簡單的算法。

回想一下,3×3矩陣的特徵多項式是一個三次多項式,這意味着你可以直接計算它的根(這是特徵值)。一旦知道了特徵值,就可以直接求解(A - lambda * I)x = 0來得到相應的特徵向量。

+0

這是一個有效的選擇,但問題也可能出現在其他地方(解決更大矩陣的線性系統),所以我也希望能夠解決這個問題 – SirGuy 2012-04-13 14:57:13

+2

@GuyGreer你希望解決的問題,你_didn't_後,甚至沒有顯示你所描述的問題的代碼......嗯。聽起來很理智 – sehe 2012-04-13 15:02:43

+0

@sehe「我也是這個問題」我的意思是我_did_發佈的問題,這可能會更加理智 – SirGuy 2012-04-13 15:10:23