![]() |
Home | Libraries | People | FAQ | More |
有一些由配置宏(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),以及函數 |
|
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_METHOD
和BOOST_MATH_RATIONAL_METHOD
可以設置為以下值:
|
值 |
作用 |
|---|---|
|
0 |
多項式和有理函數使用霍納法則( Horner's method),和一個簡單的for循環。
注意,如果多項多和有理函數的次數是一個運行時的值,或者次數大於 |
|
1 |
多項式和有理函數不使用循環來計算而使用霍納法則( Horner's method)。這僅當次數在編譯時是已知的且次數小於或等於 |
|
2 |
多項式和有理函數不使用循環來計算而使用一個二階的霍納法則 (second Horner's method)。在理論上,這可以使得多項式中的兩個操作並行,有理函數中的四個操作可以並行。這僅當次數在編譯時是已知的且次數小於或等於 |
|
3 |
多項式和有理函數不使用循環來計算而使用一個二階的霍納法則 (second Horner's method)。在理論上,這可以使得多項式中的兩個操作並行,有理函數中的四個操作可以並行。與方法「2」中的區別在於,在方法「2」中代碼被認真地進行了排序使得並行操作對於編譯器更明顯一些:而不依賴於編譯器的優化器。這僅當次數在編譯時是已知的且次數小於或等於 |
為了判定哪一種選擇更適合你的編譯器/操作系統,使用一般的編譯選項來編譯這些性能測試程序,並使用--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_POLICY
為false, 或者在調用一個特殊函數或分佈時 通過指定一個特定的策略 來改變缺省策略。參考策略手冊。
進行從double到long double和不進行從double到long double的類型提升的性能比較
|
函數 |
GCC 4.2 , Linux (使用從 double 到 long double的提升). |
GCC 4.2, Linux (不使用從double到long double的提升). |
|---|---|---|
|
1.48
(1.387e-007s)
|
1.00
(9.377e-008s)
|
|
|
1.11
(4.009e-007s)
|
1.00
(3.598e-007s)
|
|
|
1.29
(5.354e-006s)
|
1.00
(4.137e-006s)
|
|
|
1.44
(2.220e-005s)
|
1.00
(1.538e-005s)
|
|
|
1.25
(7.009e-005s)
|
1.00
(5.607e-005s)
|
|
|
1.26
(3.116e-006s)
|
1.00
(2.464e-006s)
|
|
|
1.27
(1.178e-005s)
|
1.00
(9.291e-006s)
|
|
|
1.20
(2.765e-005s)
|
1.00
(2.311e-005s)
|