直接计算最佳线程数设置



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

我的第一次尝试是指定

[numthreads(32,32,1)]

我的调度() 调用始终

Dispatch(ceil(screenWidth/numThreads.x),ceil(screenHeight/numThreads.y),1)

所以对于第一个实例,这将是

Dispatch(25,19,1)

这以 25-26 fps 的速度运行。然后我减少到以 16 fps 运行的 [numthreads(4,4,1)]。将其增加到[numthreads(16,16,1)]开始产生大约30 fps的良好结果。玩弄 Y 线程组编号 [numthreads(16,8,1)] 设法将其推到 32 fps。

我的问题是是否有一种最佳方法来确定线程数,以便我可以最有效地利用 GPU,或者只是很好的试错?

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

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

目标是增加"占用率",换句话说,占用率 == 100% - 空闲百分比归因于硬件开销

性能分析是保证特定硬件上最大性能的唯一方法。 但作为一般规则,只要您将实时寄存器计数保持在较低(16 或更低)并且不使用大量共享内存,恰好 256 个线程的线程组应该能够使大多数计算硬件饱和(假设您调度至少 8 个左右的组)。

最新更新