編碼自動向量化的最佳做法
隨着實現變得更加複雜,編譯器可以自動矢量化代碼的可能性降低了。 例如,具有以下特徵的循環特別難以(或不可能)進行矢量化:
不同循環迭代之間具有相互依賴性的循環。
帶有break子句的循環。
具有複雜條件的循環。
Arm建議修改您的源代碼實現以消除這些情況。
例如,自動向量化的必要條件是必須在循環開始時就知道循環大小中的迭代次數。 中斷條件意味着循環大小在循環開始時可能是未知的,這將阻止自動向量化。 如果不可能完全避免出現中斷條件,則值得將循環分解爲多個可矢量化和不可矢量化的部分。
可以在LLVM-Clang文檔中找到有關用於控制循環矢量化的編譯器指令的完整討論,但最重要的兩個是:
#pragma clang loop vectorize(enable)
#pragma clang loop interleave(enable)
這些實用說明提示編譯器分別執行SLP和Loop向量化。 它們是Arm Compiler的[COMMUNITY]功能。
Arm C / C ++編譯器Linux用戶空間編譯器提供了有關自動矢量化的更詳細的指南,儘管許多要點將適用於LLVM-Clang變體:
Arm C / C ++編譯器:自動矢量化的編碼最佳實踐
Arm C / C ++編譯器:使用編譯指示控制自動矢量化