目錄
10.30 運算符精度
是否應該定義add和multiply等操作的精度?
這些不是由C ++標準定義的,但通常假設C ++實現將使用IEEE 754算法。對於通常僅支持IEEE 754的子集的GPU而言,情況並非如此。此外,諸如超越函數的許多操作被認爲太昂貴而不能以超過10個有效精度位實現。除法通常通過倒數和乘法來實現。在整數除法的情況下,這可能導致非明顯的錯誤。例如:
9/3 = 9.0 *(1.0 / 3.0)= 9.0 * 0.333 = 2.997 = 2(整數)
A:鑑於當前實施的範圍很廣,標準化這些精度是不可行的。 因此,操作的精確性取決於實現。
10.31 編譯器轉換
應該允許哪些編譯器轉換?
C ++禁止編譯器轉換表達式來改變最終結果。 (請注意,C ++允許使用比指定更高的精度,但這是一個不同的問題。)GPU通常使用此類.例如,在將順序代碼映射到基於矢量的體系結構時進行轉換。
A:允許一組指定的轉換(除了C ++允許的轉換)
10.32 在預處理器中擴展類函數宏
擴展宏時,每個宏只能應用於原始token或從該token生成的任何token。 爲了實現這一點,類功能宏的擴展需要爲每個token保留一個應用宏列表。這是一個很大的開銷。
A:遵循C ++規範。
如果在擴展類函數宏期間遇到指令,那麼行爲應該是什麼?
雖然有幾個編譯器實現了預期的行爲,但目前在C ++中將其指定爲未定義。
A:當做是未定義的行爲。
10.33 擴展宏是否應在全局範圍內定義?
對於每個擴展,都有一個關聯的宏,着色器可以使用它來確定擴展是否可用於給定的實現。 該宏是全局定義還是應該在(成功)啓用擴展時定義?
這兩種選擇都是可用的,因爲嘗試啓用未實現的擴展只會導致警告。
選項1:全局定義
#ifdef GL_OES_standard_derivatives
#extension GL_OES_standard_derivatives : enable
...
#endif
選項2:定義爲#extension的一部分
#extension GL_OES_standard_derivatives : enable // warning if not available
#ifdef GL_OES_standard_derivatives
...
#endif
A:宏是全局定義的。
版權:https://blog.csdn.net/flycatdeng/article/details/88771873