我最近一直在使用计算着色器,并且正在尝试确定设置[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了吗?还是很好的反复试验?
这是特定于GPU的,但是如果您使用的是NVIDIA硬件,则可以尝试使用CUDA Occupancy Calculator。
我知道您正在使用DirectCompute,但是它们映射到相同的基础硬件。如果查看FXC的输出,则可以看到程序集中每个线程的共享内存大小和寄存器。您也可以从中得出您的卡的计算能力。计算能力与CUDA等效,例如cs_4_0,cs_4_1,cs_5_0等配置文件。
目标是增加“占用率”,换句话说就是占用率== 100%-应付HW费用的百分比空闲
分析是保证特定硬件上最高性能的唯一方法。但是通常,只要保持活动寄存器的数量少(16个或更少),并且不使用大量共享内存,恰好256个线程的线程组就应该能够使大多数计算硬件饱和(假设您使用的是重新分配至少8个左右的组)。