我正在尝试使用GPU实现一个复杂的算法。唯一的问题是硬件限制,最大可用功能级别是9_3。DirectX 11,结合像素着色器以防止瓶颈
算法对于两幅图像基本上是“立体匹配”类算法。由于上述限制,所有计算必须仅在顶点/像素着色器中执行(没有可用的计算API)。顶点着色器在这里毫无用处,所以我认为它们是直通顶点着色器。
让我简单的介绍它的算法:
采取两个图像,并计算成本卷映射(基本上conterting RGB到灰度 - >通过d翻译右图像和左图像中减去)。对于生成Texture3D的不同D,该步骤重复约20次。
问题就在这里:我不能简单地创建一个支持Pixel Shader它计算 一气呵成的20次重复,因为像素 着色器的大小限制的,所以我不得不调用绘制(最大512个算术。) ()在循环 在C++中不需要涉及CPU,而所有操作都在 完成相同的两个图像 - 在我看来,我似乎有一个瓶颈在这里。我知道有多个渲染目标,但是:有最大值。 8个目标(我需要20+),如果我想在一个像素着色器中生成8个结果,那么我超过了它的大小限制(我的HW有512个算法)。
然后我需要与窗口来计算每个计算纹理箱式滤波器的其中r> 9.
这里的另一问题:因为窗口是如此之大我需要分割盒过滤器使其成为两个像素着色器(分别为垂直和水平方向),因为循环展开阶段结果的代码很长。手动实现这些循环对于大像素着色器来说无助于它。因此,另一个瓶颈在这里 - CPU需要参与将结果从临时纹理(V pass结果)传递到第二遍(H pass)。
然后在下一步中对第一步和第二步的每对结果进行一些算术运算。
我还没有到达这里与我的发展,所以不知道什么样的瓶颈在这里等着我。
然后最小d(从第一步骤参数的值),在步骤采取基于像素值从步骤3
...相同的每个像素为3
这里基本上是非常简单的图表显示我目前的实施(不包括步骤3和4)。
红点,其中部分结果被存储,并在每个红点CPU被卷入/圈/无论是临时缓冲器(纹理)。
问题1:是不是有可能以某种方式让GPU知道如何执行每个分支形式直到底部而不涉及CPU并导致瓶颈?即一次编程图形管道序列,然后让GPU完成工作。
关于渲染到纹理的东西的另一个问题:即使在Draw()方法调用和Pixel/Vertex着色器切换之间,所有纹理都一直驻留在GPU内存中吗?或者从GPU到CPU的任何转移发生......因为这可能是另一个问题导致瓶颈。
任何帮助,将不胜感激!
预先感谢您。
最好的问候, 卢卡斯
谢谢您的回答! –
你消除了我的疑惑。我的发展问题是我为移动设备开发,无法找到合适的GPU分析器。也许我会尝试在一些具有“可比”性能的旧PC上运行我的代码,以了解它的行为。再次感谢! –