Bitcoin-Core
自編譯比特幣核心的編譯器優化
如果我使用 README 中的指令編譯比特幣核心,C++ 編譯器是否對我目前的 CPU 使用編譯器優化,或者它會輸出一個“通用”二進製文件,幾乎可以在任何 CPU 上執行?例如,如果我的 CPU 支持 AVX-512 指令,編譯器會自動輸出合適的二進製文件還是根本不考慮任何 CPU 特性?如果是這樣,我如何確保在我的機器上執行最佳二進製文件?
預設情況下,是和否。
不,大部分程式碼都是為通用目標硬體編譯的。如果你想為你的實際硬體優化一些東西,你可以添加
-march=native
到你的編譯標誌(例如你會執行./configure CFLAGS="-march=native" CXXFLAGS="-march=native"
)。這將導致二進製文件可能無法在您自己的其他硬體上執行。這可能會給您帶來一些性能提升,但不太可能產生巨大影響,因為…是的,一些程式碼有幾個總是編譯進去的變體,最佳的一個是在執行時根據可用的硬體特性決定的。這包括:
- 存在 SSE4、SSE4.1、AVX2 和 SHA-NI 的 SHA256 版本。
- 存在用於 ARM64 和 SSE4.2 的 CRC32 版本(在 LevelDB 中)。
- 如果硬體提供(除了其他隨機源),內部隨機數生成器將使用 RDRAND/RDSEED。
當然,針對特定硬體或功能可以進行更多優化,但通常這並不像打開編譯器標誌那麼容易——它還需要不同的程式碼才能實際使用它。例如,編譯通用 SHA256 程式碼
-march=native
將提供適度的加速,但使用旨在利用 256 位寬寄存器 AVX2 的程式碼在某些情況下可以通過並行計算多個雜湊值快幾倍。