我最近一直在使用计算着色器,我正在尝试确定设置[numthreads(x,y,z)]和调度调用的最佳方法。我的演示窗口是800x600,我每像素启动1个线程。我正在进行2D纹理修改 - 没什么太重的。
我的第一次尝试是指定
[numthreads(32,32,1)]
My 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,或者是最好的试验和错误?
答案 0 :(得分:3)
它非常适合GPU,但如果您使用的是NVIDIA硬件,则可以尝试使用CUDA Occupancy Calculator。
我知道您正在使用DirectCompute,但它们映射到相同的底层硬件。如果查看FXC的输出,您可以在程序集中看到共享内存大小和每个线程的寄存器。您还可以推断出您拥有的卡的计算能力。计算能力是CUDA等同于cs_4_0,cs_4_1,cs_5_0等的配置文件。
目标是增加“占用率”,或者换句话说占用率== 100% - %空闲 - 由于硬件开销
答案 1 :(得分:2)
分析是保证特定硬件最高性能的唯一方法。但作为一般规则,只要您将实时寄存器数量保持在较低(16或更低)且不使用大量共享内存,精确256个线程的线程组应该能够使大多数计算硬件饱和(假设您'至少派出8个左右的小组)。