2013-05-03 53 views
1

我是性能至關重要的軟件包的首席開發人員。的表現表示軟件可以大大提高當某些設施齊備,如:Autoconf:默認的開箱即用優化與交叉編譯

  • 軟件庫(如BLAS,LAPACK,...)對SSE,MMX,
  • 支持...

我處於一種難以決定最明智的方法的情況。我看事情的方式,這是我的選擇:

  1. 確保可移植性和正確的交叉編譯:通過利用現有設施和可選強制用戶的使用-enable-X標誌等,這是必須明確使他們爲了可移植性,因爲構建平臺上可用的工具可能不會出現在目標平臺上。 PRO:可移植性和交叉編譯正常工作。 CON:新手用戶會忘記優化,並因此遭受性能損失。
  2. 爲新手用戶提供方便:在配置階段自動檢查庫和功能(如SSE)的可用性,並隨後使用所有可用的工具。 PRO:用戶可以毫無顧慮地獲得軟件的優化版本。 CON:不能保證可移植性(例如,如果主機有SSE且目標沒有交叉編譯,我不希望我的用戶進行交叉編譯,但死亡和稅收是生命中唯一的確定性)。

我目前傾向於選項2,因爲這是我期望大多數用戶欣賞。此外,迎合缺省行爲的新手可能更有意義。我知道這是便攜性方面的一個主要罪過。你們認爲最明智的做法是什麼?

我有什麼解決方案,我不知道我的困境?

+0

瞭解新手的定義會有所幫助。部署到其他開發人員的軟件包,您希望知道這些事情與發送給公衆的軟件包不同。最終,我覺得這是一個沒有事實答案的問題,但如果「新手」真的意味着新手,我會傾向於傾向於開箱即用,保證。任何有足夠經驗的人都知道某些東西沒有足夠優化,可以將自己的部分弄清楚。 – ChrisCM 2013-05-03 19:26:26

回答

0

無論SSE庫的可用性如何,您是否可以不構建未優化的二進制文件,並在運行時確定將使用哪些版本?如果您使用動態鏈接,這不會導致運行時出現任何性能消耗或開銷。

+0

感謝您的回覆,它讓我考慮使用gcc的STT_GNU_IFUNC來調度CPU。這似乎是一個優雅的解決方案,可以自動使用CPU功能,如SSE,AVX等。 – 2013-05-04 23:15:21

1

這個問題本質上是主觀的,但我認爲選項(1)是一個更好的選擇 - 因爲你指定「性能是最重要的」。

一個軟件包(即發行版用戶)的大部分用戶都會對預先構建的軟件包或帶有默認選項的源代碼版本感到滿意。如果性能嚴重,則期望用戶熟悉編譯器標誌和configure ...的用法是合理的。如果用戶不被性能困擾,或者懶得閱讀發行版中的簡單README,那麼默認構建應該是可行的 - 它不需要是最佳的。

我不知道關於交叉編譯的缺點 - 它似乎你可能有hosttarget混淆,因爲target是構建交叉編譯工具的罕見之外。正確使用host三元組與config.guess一起提供了大量有用的信息。例如:

case $host_cpu in 
    x86_64) ... we always have SSE available ... ;; 
esac 

現在讓我們假設你指定-march=core2爲[交叉]編譯標誌:

#if defined (__SSE3__) 
#include <pmmintrin.h> /* (SSE3 Intel intrinsics) 
#endif 

甚至會用一個交叉編譯工作。 (雖然現在<immintrin.h>是最好的)

總之,新手用戶獲得新手構建。您無法針對每種可能的主機和環境組合進行優化,但您可以提供選項。

+0

感謝您的回覆Brett。我完全同意用戶應該閱讀自述文件,但不幸的是,情況往往不是這樣。在這種特殊情況下,新手用戶指的是那些比標準的configure-make-make安裝鏈更多的知識。 這就是說,我同意你關於使用選項的觀點。另外,我相信部分問題(使用CPU能力,如SSE)可以通過CPU調度(例如,gcc的STT_GNU_IFUNC)來解決。 – 2013-05-04 23:23:25