2016-08-19 5 views
3

私はVulkan計算シェーダのセットに特定のアルゴリズムを実装することに興味があります。このアルゴリズムは、ある時点でclz()関数を使用します。私は、NVIDIA GPUがおそらくこの機能のハードウェアサポートを提供していると思います。 CUDAは明らかにclz命令を使用し、clz()もOpenCL 1.2に含まれています。だから私は自分のclz()を書いたくない。 CUDAやOpenCLのやり方でこの関数を呼び出す方法はありますか?Vulkanの計算シェーダでclz()を使用する方法はありますか?

私はOpenCLカーネルをSPIR-VにコンパイルしてVulkanでそれを使ってみることができますが、Vulkanはそれについて非常に満足しているとは思いません...?

もう1つは、SPIR-Vアセンブリへのclz()呼び出しを含む非常に単純なOpenCLカーネルを翻訳し、GLSLシェーダで同じことをしてから、clz()呼び出しを手動でハックすることですカーネルアセンブリコードに表示されるように、シェーダのアセンブリコードに書き込まれます。しかし、私はSPIR-Vの詳細や、計算機シェーダーがどのような種類のSPIR-V命令を使用するかについてVulkanがどのような制限を設けているかについては何も知らないので、実際に動作するかどうかについてはほとんど考えていません。

+0

さらなる調査の後、更新された回答に注意してください。 –

答えて

6

バルカン結合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

関連する問題