2012-05-25 28 views
9

我遇到過幾種情況,聲稱GLSL中的點積最終會在一個週期內運行。例如:GLSL - 點產品真的只需要一個週期嗎?

頂點和片段處理器上四向量進行操作,執行四組分指令,如加法,乘法,乘法 - 累加,或點積在一個週期。

http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter35.html

我也看到在評論索賠某處:

dot(value, vec4(.25)) 

將是一個更有效的方式來平均水平的4個值,相比於:

(x + y + z + w)/4.0 

再一次,聲明是點(vec4,vec4)將在一個週期中運行。

我看到ARB says that dot product (DP3 and DP4) and cross product (XPD是單個指令,但是這是否意味着那些在執行vec4添加時就像計算上一樣昂貴?在這裏,基本上有一些硬件實現,沿着類固醇乘法積累的方式嗎?我可以看到這樣的東西在計算機圖形學中是有用的,但是在一個循環中做什麼可能是他們自己聽起來很多的一些指令。

回答

11

這個問題不能以任何明確的方式作爲一個整體來回答。硬件的任何操作需要多長時間不僅僅是硬件特定的,還有特定代碼。也就是說,周圍的代碼可以完全掩蓋操作所需的性能,或者可能需要更長的時間。

一般而言,您不應該假設點積是單週期的。

不過,也有某些方面當然可以回答:

我也看到在評論索賠某處:

將是一個更有效的方式來平均水平的4個值相比,於:

我希望這是有點真,只要xyzw其實都是不同的浮點值而不是同一個vec4的成員(也就是說,他們不是value.x,value.y等)。如果它們是同一個向量的元素,我會說任何體面的優化編譯器都應該將這兩個都編譯成同一組指令。一個好的peephole optimizer應該可以捕捉到這樣的模式。

我說這是「有點兒真實」,因爲它取決於硬件。點積產品版本應該至少不是較慢的。再次,如果它們是同一個向量的元素,那麼優化器應該處理它。

單個指令,但這是否意味着這些只是做一個vec4添加計算昂貴?

你不應該假設ARB裝配有任何關係到實際的硬件機器指令代碼。

基本上有一些硬件實現,沿着類固醇乘法累積的方式,在這裏玩嗎?

如果你想談論硬件,它是非常硬件特定的。曾幾何時,有專門的網點產品硬件。這是在所謂的「DOT3 bumpmapping」和早期的DX8時代着色器的時代。

但是,爲了加快一般操作,他們不得不採取這樣的事情。所以現在,對於大多數現代硬件(又名:任何Radeon HD-class或NVIDIA 8xxx或更好的所謂的DX10或11硬件),dot-products幾乎完成了他們所說的。每個乘/加都佔用一個週期。

但是,這個硬件也允許很多並行性,所以你可以同時有4個獨立的vec4點產品。每個人需要4個週期。但是,只要這些操作的結果不被其他人使用,它們都可以並行執行。因此,他們四人總共需要4個週期。

所以再次,這是非常複雜的。和硬件有關。

最好的辦法是先從東西是合理。然後瞭解您正在嘗試編碼的硬件,並從那裏開始工作。

+0

好吧,謝謝。 「你不應該認爲ARB組件與實際的硬件機器指令代碼有任何關係。」基本上是我所希望的簡明答案。這看起來像ARB是一個有利可圖,很難找到很多有關Google的材料。這是我似乎無法證實的那些「部落知識」類型的事情之一,事實上這一段時間的事實是合理的。很酷的東西。 – ultramiraculous

0

關鍵是一個vec4可以在一個單一的指令「操作」(請參見英特爾工作16個字節的寄存器操作一樣,又名多的依據爲IOS加速架構)。

如果你開始分裂和混寫分開矢量就不再是載體的「單存儲器地址」來執行運算。

4

尼科爾流星錘處理的實際的答案,從「ARB組件」的角度或在看IR轉儲。我會解決這個問題「硬件中4個倍數和3個增量如何變成一個循環?!這聽起來不可能。」

對於繁重的流水線操作,任何指令都可以具有一個循環的吞吐量,無論多麼複雜。

不要將此與一個延遲週期混淆!

通過完全流水線執行,指令可以分散到流水線的多個階段。管道的所有階段都同時運行。

每個循環中,第一階段接受一個新的指令,並且它的輸出進入下一階段。每個週期結果都出現在管道的末端。

讓我們來看看4D點積,對於假設的核心,具有3個週期的乘法延遲,以及5個週期的增加延遲。

如果此管道被佈置在最糟糕的方式,沒有載體的並行性,這將是4次乘法和3增加,給出總共12 + 15個循環27個循環的總等待時間。

這是否意味着一個點產品以27個週期?絕對不是,因爲它可以在每個循環中開始一個新的循環,並在27個循環後得到答案。

如果你需要做一個點的產品,不得不等待答案,那麼你將不得不等待結果的完整27個週期的延遲。但是,如果您有1000個單獨的點積計算,則需要1027個週期。第26個週期,有沒有結果,27日週期的第一個結果出來的結束,第1000個輸入發出後,又過了26個週期的最後結果出來到底。這使得點積「一個週期」。

真實處理器有多種方式跨階段分佈的工作,讓更多或更少的流水線級數,所以他們可能有完全不同的數字比我上面的描述,但這個想法是一樣的。通常,每個階段你做的工作越少,時鐘週期就會變得越短。

+0

這是一個描述性措辭的答案,我完全讚賞它! –

相關問題