DirectCompute最佳numthreads设置

问题描述 投票:6回答:2

我最近一直在使用计算着色器,并且正在尝试确定设置[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了吗?还是很好的反复试验?

directx direct3d directx-11 compute-shader directcompute
2个回答
3
投票

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

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

目标是增加“占用率”,换句话说就是占用率== 100%-应付HW费用的百分比空闲


2
投票

分析是保证特定硬件上最高性能的唯一方法。但是通常,只要保持活动寄存器的数量少(16个或更少),并且不使用大量共享内存,恰好256个线程的线程组就应该能够使大多数计算硬件饱和(假设您使用的是重新分配至少8个左右的组)。

© www.soinside.com 2019 - 2024. All rights reserved.