OepnCL優化浮點計算
對於浮點操作,可以手動指導離線編譯器進行優化,以在硬體中建立更有效的pipeline結構並減少總體硬體的使用率。這些優化可能會導致浮點操作的結果產生細小差別。
Tree Balancing
離線編譯器不會自動將程式優化成樹平衡結構運算,因為這會導致結果與真實結果有些許差別。如果不在意浮點結果的細微差別,並希望離線編譯器使用平衡樹結構優化浮點運算,則需要在aoc命令中包括-fp-relaxed選項:
aoc -fp-relaxed <kernel_filename>.cl
Rounding Operations
浮點運算的平衡樹結構包含多個舍入運算,這些舍入操作在某些應用程式中可能需要大量的硬體資源,離線編譯器不會自動減少舍入運算的數量。如果可以接受浮點運算結果的細小差異,可以使用aoc命令中的-fpc
aoc -fpc <kernel_filename>.cl
-fpc選項指示離線編譯器執行以下任務:
儘可能的刪除浮點舍入運算及轉換。如果可能,離線編譯器僅在浮點運算樹的末尾舍入一次浮點運算。
攜帶其他尾數位以保持精度。離線編譯器在浮點計算過程中攜帶其他精度位,並在浮點運算樹的末尾刪除這些精度位。
這種型別的優化會導致硬體執行融合的浮點運算,這也是許多新硬體處理系統的功能。融合多個浮點運算可以最大程度地減少舍入步驟,從而獲得更準確的結果。
浮點vs定點表示
FPGA包含大量用於實現浮點運算的邏輯,但只要有可能,就可以使用資料的定點表示來增加可用的硬體資源量。實現定點運算所需的硬體資源通常要小於等效地浮點運算。所以與等效的浮點運算相比,可以在FPGA中容納更多的定點運算。
OpenCL的標準不支援定點表示,必須使用整數資料型別實現。硬體開發者通常使用定點資料以節省硬體,並且僅保留執行計算所需的資料解析度。必須使用8\16\32\64位標量資料型別,因為OpenCL標準支援這些資料解析度。然而,可以在原始碼中包含適量的遮蔽操作,以便硬體編譯工具可以執行優化來節省硬體資源。
例如,演算法使用17位資料的定點表示,那必須使用32位資料型別儲存該值。如果使用Intel SDK的離線比那一起將兩個17位的定點值加在一起,離線編譯器必須建立額外的硬體來處理多餘的高15位。為了避免使用額外的硬體,可以使用靜態位掩碼來指示硬體編譯工具在硬體編譯期間忽略不必要的位。