我正在尝试使用 GPU 实现一种复杂的算法。唯一的问题是硬件限制,最大可用功能级别为 9_3。
算法基本上是两个图像的“立体匹配”算法。由于上述限制,所有计算只能在顶点/像素着色器中执行(没有可用的计算 API)。顶点着色器在这里相当无用,所以我认为它们是直通顶点着色器。
让我简要描述一下算法:
拍摄两张图像并计算成本体积图(基本上将 RGB 转换为灰度 -> 将右图像转换为D并从左图像中减去它)。对于生成 Texture3D的不同D ,此步骤重复大约 20 次。
这里的问题:我不能简单地创建一个像素着色器来一次性计算这 20 次重复,因为像素着色器的大小限制(最多 512 个算术),所以我不得不在 C++ 中的循环中调用 Draw(),这不必要涉及CPU,而所有操作都在相同的两个图像上完成 - 在我看来,我在这里有一个瓶颈。我知道有多个渲染目标,但是:有最大值。8 个目标(我需要 20+),如果我想在一个像素着色器中生成 8 个结果,我会超出它的大小限制(我的硬件为 512 算术)。
然后我需要计算每个计算的纹理框过滤器,其中 r > 9 的窗口。
这里的另一个问题是:因为窗口太大,我需要将框过滤拆分为两个像素着色器(分别垂直和水平方向),因为循环展开阶段会产生非常长的代码。这些循环的手动实现无济于事,因为它仍然会创建大像素着色器。所以这里的另一个瓶颈- CPU 需要参与将结果从临时纹理(V 通道的结果)传递到第二通道(H 通道)。
然后在下一步中,对来自第一步和第二步的每对结果应用一些算术运算。
我的发展还没有到达这里,所以不知道什么样的瓶颈在等着我。
然后根据步骤 3 中的像素值为每个像素获取最小 D(第 1 步中的参数值)。
...与第 3 步相同。
这里基本上是非常简单的图表,显示了我当前的实现(不包括步骤 3 和 4)。
红点/圆圈/任何东西都是临时缓冲区(纹理),其中存储部分结果,并且每个红点 CPU 都参与其中。
问题1:是否有可能让GPU知道如何在不涉及CPU并导致瓶颈的情况下将每个分支形式执行到底?即一次性对图形管道序列进行编程,然后让 GPU 完成它的工作。
关于渲染到纹理的另一个问题:即使在 Draw() 方法调用和像素/顶点着色器切换之间,所有纹理是否一直驻留在 GPU 内存中?或者发生从 GPU 到 CPU 的任何传输......因为这可能是另一个导致瓶颈的问题。
任何帮助,将不胜感激!
先感谢您。
最好的问候,卢卡斯