我最近一直在使用计算着色器,并且试图确定设置[numthreads(x,y,z)]和调度调用的最佳方法。我的演示窗口是800x600,我每个像素启动1个线程。我正在执行2D纹理修改-太重了。

我的第一次尝试是指定

[numthreads(32,32,1)]

我的Dispatch()调用总是
Dispatch(ceil(screenWidth/numThreads.x),ceil(screenHeight/numThreads.y),1)

因此,首先是
Dispatch(25,19,1)

这以25-26 fps的速度运行。然后,我将速度降低为[numthreads(4,4,1)],以16 fps的速度运行。将其增加到[numthreads(16,16,1)]开始产生约30 fps的漂亮结果。
玩弄Y线程组号[numthreads(16,8,1)]可以将其推到32 fps。

我的问题是,有没有一种确定线程数的最佳方法,这样我就可以最有效地利用GPU了?还是反复无常?

最佳答案

它是特定于GPU的,但是如果您使用的是NVIDIA硬件,则可以尝试使用CUDA Occupancy Calculator

我知道您正在使用DirectCompute,但是它们映射到相同的基础硬件。如果查看FXC的输出,则可以看到程序集中每个线程的共享内存大小和寄存器。您也可以从中得出卡的计算能力。计算能力相当于CUDA,例如cs_4_0,cs_4_1,cs_5_0等配置文件。

目标是增加“占用率”,换句话说就是占用率== 100%-应付HW费用为%idle

关于directx - DirectCompute最佳numthreads设置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19560094/

10-09 13:12