2016-08-19 108 views
3

我有興趣在一組Vulkan計算着色器中實現特定的算法。該算法在一個點上使用clz()函數。我期望我的NVIDIA GPU可能爲此功能提供硬件支持;顯然CUDA使用clz指令,並且clz()也在OpenCL 1.2中。所以我不想寫我自己的clz()。我有沒有辦法以CUDA或OpenCL的方式調用函數?有沒有辦法在Vulkan計算着色器中使用clz()?

我想我可以嘗試將OpenCL內核編譯爲SPIR-V並在Vulkan中使用它,但是我不認爲Vulkan會對此感到高興......?

我的另一個想法是,也許我可以將包含clz()調用的非常簡單的OpenCL內核翻譯爲SPIR-V程序集,對我的GLSL着色器執行相同操作,然後手動破解clz()調用,因爲它在內核彙編代碼中出現在着色器的彙編代碼中。但是我對SPIR-V的細節,或者Vulkan可能放在計算着色器可能使用的SPIR-V指令的限制上的任何限制都沒有真正瞭解,所以我幾乎沒有任何關於這是否可行的想法。

+0

進一步研究後,請注意更新後的答案。 –

回答

6

Vulkan綁定的SPIR-V可以訪問GLSL extended instruction set,其中包含函數FindUMSB,該函數找到最重要的位。你可以用31 - FindUMSB來模擬clz。如果硬件有明確的clz指令,那麼編譯器可以將該減法分解並用內部clz代替表達式。

+0

請注意,HLSL中的類似函數_ [firstbithigh](https://msdn.microsoft.com/en-us/library/windows/desktop/ff471400(v = vs.85).aspx)_是一個核心函數在dx11中。如果設備不支持它,我認爲編譯器可能是不透明的,只是模擬它。你可能也會這樣做。 – Quinchilion

+0

@ Quinchilion:是的,事實證明GLSL也有這個功能。 –

+0

具體來說,我在GLSL中看到了一個[findMSB](https://www.opengl.org/sdk/docs/man/html/findMSB.xhtml)函數,我假設它會轉換(在從GLSL編譯爲SPIR- V)根據參數的類型轉換爲FindUMSB或FindSMSB。就我而言,這足以讓人滿意。謝謝! – mjwach

相關問題