1

我正在使用 DirectCompute 在 GPU 上进行一般计算。目前,我正在尝试对分辨率为 1920x1080 的纹理进行操作。我有一个 Dispatch(2, 1080, 1) 和 numthreads(960, 1, 1) 根据我的计算,它们准确地覆盖了我的图像,每个像素一个线程。

现在,据我了解,所有线程都应该同时运行,对吧?但是,在我的代码中,如果像素为黑色,我不会进行任何计算。因此,当我的大部分图像为黑色时,我注意到性能明显提高。但是,如果一个物体挡住了屏幕,性能就会急剧下降。

我的问题是:如果所有线程都并行运行,处理一帧的速度将由性能最差的线程决定,本质上运行在黑色像素上的线程将处于空闲状态,对吧?那么,为什么在处理更多像素时我会看到速度变慢?他们应该同时这样做。还是我把这一切都搞错了?

任何帮助,将不胜感激。

4

2 回答 2

2

并非所有线程都同时执行。确切的数字可能发生了一些变化,但几年前,高端 CPU 能够一次保持 16k 线程运行,但实际上“只有”几百个线程同时执行。(然后将其进一步细分为更小的子组,并且这样的子组中的每个线程都以精确的锁步、逐条指令、逐个分支的方式运行)其余的被挂起,等待 I/O 或以其他方式阻塞。

因此,如果您有一个需要 200 万次执行的算法,那么在任何时候它们中只有一小部分会以线程的形式存在,而其中只有一小部分实际上是在一个批次中执行的。在当前正在执行的线程中,有一些被迫以精确的步调运行(因此不存在一个线程提前退出,整个组必须遵循相同的路径),但不同的组可以在不同的时间终止.

是的,GPU 上的线程很复杂。

于 2012-10-25T09:28:52.133 回答
0

如果您有一个非常繁重的算法,并且正在使用您的图像进行后缓冲渲染,它可能会造成停顿。强制后台缓冲区等待图像。尝试在下一帧渲染它。所以你是“落后的”。

你的算法看起来如何?

于 2012-10-25T09:20:55.440 回答