DirectCompute最佳numthreads设置

Val*_*tin 6 directx direct3d directx-11 compute-shader directcompute

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

我的第一次尝试是指定

[numthreads(32,32,1)]
Run Code Online (Sandbox Code Playgroud)

我的Dispatch()调用总是如此

Dispatch(ceil(screenWidth/numThreads.x),ceil(screenHeight/numThreads.y),1)
Run Code Online (Sandbox Code Playgroud)

因此,对于第一个实例

Dispatch(25,19,1)
Run Code Online (Sandbox Code Playgroud)

这个速度为25-26 fps.然后我减少到[numthreads(4,4,1)],运行速度为16 fps.将它增加到[numthreads(16,16,1)]开始了大约30 fps的良好结果.使用Y线程组编号[numthreads(16,8,1)]进行操作,设法将其推送到32 fps.

我的问题是有没有一种最佳的方法来确定线程数,这样我可以最有效地利用GPU,或者只是好的试验和错误?

Luc*_*cas 4

它非常特定于 GPU,但如果您使用的是 NVIDIA 硬件,您可以尝试使用CUDA 占用计算器

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

目标是增加“占用率”,换句话说,占用率 == 100% - %idle- due-to-HW-overhead