6

我最近一直在玩计算着色器,我正在尝试确定设置我的 [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 的速度运行。然后我减少到以 16 fps 运行的 [numthreads(4,4,1)]。将其增加到 [numthreads(16,16,1)] 开始产生大约 30 fps 的不错结果。玩弄 Y 线程组编号 [numthreads(16,8,1)] 设法将其推到 32 fps。

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

4

2 回答 2

4

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

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

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

于 2013-10-24T09:07:26.810 回答
2

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

于 2013-10-24T19:50:48.773 回答