【问题标题】:DirectCompute optimal numthreads setupDirectCompute 最优线程数设置
【发布时间】:2013-11-02 19:34:47
【问题描述】:

我最近一直在玩计算机着色器,我正在尝试确定设置 [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,还是只是好的尝试和错误?

【问题讨论】:

    标签: directx direct3d directx-11 compute-shader directcompute


    【解决方案1】:

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

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

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

    【讨论】:

    • 我必须设置哪些编译选项才能获得 FXC 汇编输出?我尝试了 /Fc 但输出文件中的任何内容都没有给我您描述的信息。我使用msdn.microsoft.com/en-us/library/windows/desktop/… 作为参考。
    • 我只是用配置文件(/T)编译它,你可以看到汇编代码。 dcl_temps 告诉您寄存器计数,dcl_tgsm_* 语句告诉您共享内存大小。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多