Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

性能調整宏(Performance Tuning Macros)

有一些由配置宏(configuration macros)來決定的性能調整選項。這些宏在boost/math/tools/user.hpp中設置; 或者報告到Boost開發郵件列表(Boost-development mailing list), 以便對於一個特定的編譯器和OS平台的的配置選項可以在我們的配置安排中自動設定。

含義

BOOST_MATH_POLY_METHOD

決定如何計算多項式和大多數的有理函數。定義為 0, 1, 2 或 3:參考下面每個值的含義。

BOOST_MATH_RATIONAL_METHOD

決定對稱有理函數如何計算:很大程度上這只影響 蘭克澤斯逼近(Lanczos approximation),以及函數evaluate_rational 如何工作。定義為 0, 1, 2 或 3: 參考下面每個值的含義。

BOOST_MATH_MAX_POLY_ORDER

一種算法所計算的多項式或有理函數的最大的次數,除了0之外 (一個簡單的"for" 循環)。

BOOST_MATH_INT_TABLE_TYPE(RT, IT)

這個庫中所使用的多項式的係數和有理函數的係數大部分都是整數。通常它們存儲為一個整數表,但是如果混合的整數/浮點算術比正規的浮點算術更慢,那麼這些係數作為一個浮點數表來存儲。如果混合算術更慢,那麼添加:

#define BOOST_MATH_INT_TABLE_TYPE(RT, IT) RT

在 boost/math/tools/user.hpp中,否則缺省的

#define BOOST_MATH_INT_TABLE_TYPE(RT, IT) IT

在 boost/math/config.hpp 已經是很好,並且可能生成更少的代碼。

BOOST_MATH_POLY_METHODBOOST_MATH_RATIONAL_METHOD 可以設置為以下值:

作用

0

多項式和有理函數使用霍納法則( Horner's method),和一個簡單的for循環。

注意,如果多項多和有理函數的次數是一個運行時的值,或者次數大於BOOST_MATH_MAX_POLY_ORDER,那麼就會一直使用這種方法,而不管BOOST_MATH_POLY_METHODBOOST_MATH_RATIONAL_METHOD的值。

1

多項式和有理函數不使用循環來計算而使用霍納法則( Horner's method)。這僅當次數在編譯時是已知的且次數小於或等於BOOST_MATH_MAX_POLY_ORDER時發生。

2

多項式和有理函數不使用循環來計算而使用一個二階的霍納法則 (second Horner's method)。在理論上,這可以使得多項式中的兩個操作並行,有理函數中的四個操作可以並行。這僅當次數在編譯時是已知的且次數小於或等於BOOST_MATH_MAX_POLY_ORDER時發生。

3

多項式和有理函數不使用循環來計算而使用一個二階的霍納法則 (second Horner's method)。在理論上,這可以使得多項式中的兩個操作並行,有理函數中的四個操作可以並行。與方法「2」中的區別在於,在方法「2」中代碼被認真地進行了排序使得並行操作對於編譯器更明顯一些:而不依賴於編譯器的優化器。這僅當次數在編譯時是已知的且次數小於或等於BOOST_MATH_MAX_POLY_ORDER時發生。

為了判定哪一種選擇更適合你的編譯器/操作系統,使用一般的編譯選項來編譯這些性能測試程序,並使用--tune 命令行選項來運行這些程序。

在實際中,這些方法之間的差別很小,如同下面的表顯示的那樣。然而,並行/In practice在將來將會變得越來越重要: 很有可能當前所支持的算法將需要被更適合於highly vectorisable processors的方法所取代。

多項式計算方法的比較

編譯器/平台

方法 0

方法 1

方法 2

方法 3

Microsoft C++ 8.0, 多項式計算

1.34

(1.161e-007s)

1.13

(9.777e-008s)

1.07

(9.289e-008s)

1.00

(8.678e-008s)

Microsoft C++ 8.0, 有理函數計算

1.00

(1.443e-007s)

1.03

(1.492e-007s)

1.20

(1.736e-007s)

1.07

(1.540e-007s)

Intel C++ 10.0 (Windows), 多項式計算

1.03

(7.702e-008s)

1.03

(7.702e-008s)

1.00

(7.446e-008s)

1.03

(7.690e-008s)

Intel C++ 10.0 (Windows), 有理函數計算

1.00

(1.245e-007s)

1.00

(1.245e-007s)

1.18

(1.465e-007s)

1.06

(1.318e-007s)

GNU G++ 4.2 (Linux), 多項式計算

1.61

(1.220e-007s)

1.68

(1.269e-007s)

1.23

(9.275e-008s)

1.00

(7.566e-008s)

GNU G++ 4.2 (Linux), 有理函數計算

1.26

(1.660e-007s)

1.33

(1.758e-007s)

1.00

(1.318e-007s)

1.15

(1.513e-007s)

Intel C++ 10.0 (Linux), 多項式計算

1.15

(9.154e-008s)

1.15

(9.154e-008s)

1.00

(7.934e-008s)

1.00

(7.934e-008s)

Intel C++ 10.0 (Linux), 有理函數計算

1.00

(1.245e-007s)

1.00

(1.245e-007s)

1.35

(1.684e-007s)

1.04

(1.294e-007s)


最後有一個性能調整選項可以作為一個編譯時的策略。通常,當以double計算一個函數時,在內部實現中是以long double來計算的:這是為了確保完整的double精度,但在一些環境下可能減慢計算速度。缺省的策略可以通過定義宏BOOST_MATH_PROMOTE_DOUBLE_POLICYfalse, 或者在調用一個特殊函數或分佈時 通過指定一個特定的策略 來改變缺省策略。參考策略手冊

進行從double到long double和不進行從double到long double的類型提升的性能比較

函數

GCC 4.2 , Linux

(使用從 double 到 long double的提升).

GCC 4.2, Linux

(不使用從double到long double的提升).

erf

1.48

(1.387e-007s)

1.00

(9.377e-008s)

erf_inv

1.11

(4.009e-007s)

1.00

(3.598e-007s)

ibetaibetac

1.29

(5.354e-006s)

1.00

(4.137e-006s)

ibeta_invibetac_inv

1.44

(2.220e-005s)

1.00

(1.538e-005s)

ibeta_inva, ibetac_inva, ibeta_invbibetac_invb

1.25

(7.009e-005s)

1.00

(5.607e-005s)

gamma_pgamma_q

1.26

(3.116e-006s)

1.00

(2.464e-006s)

gamma_p_invgamma_q_inv

1.27

(1.178e-005s)

1.00

(9.291e-006s)

gamma_p_invagamma_q_inva

1.20

(2.765e-005s)

1.00

(2.311e-005s)



PrevUpHomeNext