0

我正在尝试使用 HLSL 在计算着色器中实现二进制搜索。它不是经典的二分搜索,因为搜索键和数组值都是float. 如果没有与搜索键匹配的数组值,则搜索应该返回最后一个索引(minIdx并且maxIdx此时匹配)。这是经典二进制搜索的最坏情况,因为它需要最大数量的操作,我知道这一点。

所以这是我的问题:

我的实现如下所示:

uint BinarySearch (Texture2D<float> InputTexture, float key, uint minIdx, uint maxIdx)
{
    uint midIdx = 0;
    while (minIdx <= maxIdx)
    {
        midIdx = minIdx + ((maxIdx + 1 - minIdx) / 2);
        if (InputTexture[uint2(midIdx, 0)] == key)
        {
            // this might be a very rare case
            return midIdx;
        }

        // determine which subarray to search next
        else if (InputTexture[uint2(midIdx, 0)] < key)
        {
            // as we have a decreasingly sorted array, we need to change the
            // max index here instead of the min
            maxIdx = midIdx - 1;
        }

        else if (InputTexture[uint2(midIdx, 0)] > key)
        {
            minIdx = midIdx;
        }
    }

    return minIdx;
}

这导致我的视​​频驱动程序在程序执行时崩溃。我没有收到编译错误。

但是,如果我使用 anif而不是while我可以执行它并且第一次迭代按预期工作。

我已经进行了几次搜索,我怀疑这可能与计算着色器中的动态循环有关。但我之前没有使用计算着色器的经验,也没有使用 HLSL 的经验,这就是为什么我感到有些失落。

我正在用cs_5_0.

谁能解释我做错了什么或至少提示我一些文档/解释?任何能让我开始解决和理解这个问题的东西都会非常感激!

4

1 回答 1

1

DirectCompute 着色器仍受驱动程序中的超时检测和恢复 (TDR) 行为的影响。这基本上意味着如果您的着色器花费超过 2 秒,驱动程序会假定 GPU 已挂起并重置它。这对于 DirectCompute 来说可能是一个挑战,您故意希望着色器运行很长时间(比通常的渲染时间长得多)。在这种情况下,它可能是一个错误,但需要注意。

D3D11_CREATE_DEVICE_DISABLE_GPU_TIMEOUT在 Windows 8.0 或更高版本中,您可以通过在创建设备时使用来允许长时间运行的着色器。但是,这将适用于所有着色器,而不仅仅是 DirectCompute,因此您应该谨慎使用它。

对于特殊用途的系统,您还可以使用注册表项来禁用 TDR。

于 2015-09-17T17:41:11.517 回答