2012-04-13 46 views
4

我一直在試圖產生的Jacobi theta functionsNewton's method分形 - 我與mpmath嘗試需要很長的時間,所以我試圖編碼它C.加速θ函數評價爲牛頓法分代

用於源生成以下圖像是在這裏:http://owen.maresh.info/allegra.c和將與 GCC allegra.c -o Allegra的-lm編譯,然後應被調用作爲./allegra> jacobi.pnm

http://owen.maresh.info/jacobi.png

這樣: *有沒有方法可以加速評估 - 這花了超過半小時的時間來製作此圖片? (我希望能夠用不同的nome快速製作這些圖像,以便我可以製作電影) *我知道我在theta函數定義中犯了一個錯誤,但我很難找到原因不連續性。

爲了參考的目的,該圖像是由做於θ的標準牛頓法產生(Z,0.001-0.3019 * I)

+1

你介意我你的代碼傳給蘋果作爲一個例子編譯時運行速度慢的應用程序用他們新的'clang' C編譯器而不是他們的gcc。 – 2012-04-14 19:41:56

+0

沒問題。我打算用icc嘗試一下。 – 2012-04-14 20:22:23

+0

'icc'是個好主意。我好奇你在'gcc'上看到了多少改進。 – 2012-04-14 23:47:43

回答

3

首先嚐試使編譯器優化與-O3和/或-fast。我的系統上的快速測試顯示的一個因素或3的性能提升

此外,隨着代碼的變化試驗,以提高性能時,它是有益的更快的運行時間,也許改變你的主循環for(a=0;a<10 /* 512*/ ;a++)

而且注意:GCC支持complex numbers看手冊頁complexcpow,並且cexp,包括文件/usr/include/complex.h

我異形的應用,並認爲這是花費大部分時間都在powc()。不幸的是,當我改變powc()從數學庫中使用cpow()時,它比你的實現運行得慢。

如果您正在運行的系統具有多個內核,那麼通過將外部主循環與OpenMP並行化,掛鐘時間可能會相當容易地被降低。但是,當您爲動畫生成圖像幀時,僅用每個幀生成一個單獨的進程(我喜歡xargs -P # -n 1用於此類粗粒度並行化)就可能是最有效的。

+0

順便說一下,我的直覺是,沒有人真的在c99標準中使用複雜的數據類型來處理任何事情,而且它只是被添加到語言中,因爲有人認爲這將是一個好主意時間。 (作爲一個雙重保護:我對某種特殊功能ASIC很感興趣,因爲這些功能(Jacobi)theta在軟件中被重新實現了agazillion次,所有的軟件實現都很流暢) – 2012-04-15 01:32:08

+0

我以爲'gcc'有一段時間的複雜支持C99。但是,如果大多數'complex'的重型用戶仍在使用fortran,我不會感到驚訝。 – 2012-04-15 20:54:59

3

當您提到此在IRC上,我心情很奇怪,花了一段時間來優化它。現在在我的Mac上至少快4倍,不計算編譯器優化標誌,在其他一些平臺上更是如此。

我是...無知,當涉及到更高的數學,但我知道一些關於優化的東西。我相信這裏的計算與原始計算相同,除了用expc()代替系統cexp()來實現,它會產生相同的輸出。你可以決定它是否仍然在數值上足夠穩定。

正如布萊恩·斯威夫特指出,powc()是昂貴的,這是因爲日誌()和POW(的)功能

那名大勝利的東西:

  • 在pjtheta計算()和pjtheta3()可以結合使用
  • 計算可以在newt()中作爲內部循環,並且其中一些可以從內部循環或兩個循環中移出
  • cpow()對於Brian (和我),但cexp()肯定比你的代碼快,至少o在我的機器。嘗試一下兩種方式
  • -ffast,數學的編譯器選項刪除支持標準符合不良行爲數量和加快了很多東西

另一個大的勝利是轉換算術CEXP()和CPOW( )轉換爲單精度,但這會產生稍微不同的結果,您可能會也可能不會關心。

您可能無法識別該程序了,而是它在:

https://github.com/cgull/allegra.git

我注意到一對夫婦更多的東西,敲了另外25%-33%出來的(天哪,這是一個迭代函數會聚!)

我敢肯定,別人誰懂得高等數學比我能找到的還有性能的另一個2-4x ...