使用计算着色器的线性索引

时间:2018-05-03 11:44:44

标签: c# directx-11 sharpdx compute-shader

我使用计算着色器做一些事情。我创建一个特定长度的输入缓冲区(1维)然后调用x和y上的调度以优化计算时间。但是我访问索引时遇到了问题。可能是什么问题?

double size = Math.Ceiling(Math.Sqrt(input.pattern.Length));
shader.Start((int)Math.Ceiling(size/32), (int)Math.Ceiling(size / 32), 1);

在hlsl代码中......

[numthreads(32, 32, 1)]
void Reconstruction(uint3 dispatchThreadID : SV_DispatchThreadID)
{
    int idx = dispatchThreadID.y * size + dispatchThreadID.x;
    if (idx > rayCount) { return; }

我打印了idx,但有些是重复的,我不明白为什么......

1 个答案:

答案 0 :(得分:1)

线程分组中的维度数用作方便而不是优化。在引擎盖下,它们将会大致相同。因此,对于1D缓冲区,使用

之类的东西并不会更糟糕
for(var k=j+1; k<sorted.length; k++)  {

比你上面的。您还可以获得额外的好处,即最终在着色器中执行较少的计算,因为您将自动获取通过[numthreads(64, 1, 1)] void Reconstruction(uint3 dispatchThreadID : SV_DispatchThreadID) { int idx = dispatchThreadID.x; // ... etc ... } 参数传入的正确索引。

您应该记住的唯一优化是,组中线程的总数理想情况下应该是64的倍数。这是因为在硬件级别,AMD GPU通常使用64个线程的“波形”一时间NVidia(如果我没记错的话)32,仍然有效。如果你使用(比方说)32那么你就可以获得50%的AMD利用率,这并不酷。