这是一个关于如何确定CUDA网格,块和线程大小的问题.这是对此处发布的问题的另一个问题:
在此链接之后,talonmies的答案包含一个代码片段(见下文).我不理解评论"通常由调整和硬件约束选择的值".
我没有找到一个很好的解释或澄清,在CUDA文档中解释了这一点.总之,我的问题是如何在给定以下代码的情况下确定最佳块大小(=线程数):
const int n = 128 * 1024;
int blocksize = 512; // value usually chosen by tuning and hardware constraints
int nblocks = n / nthreads; // value determine by block size and total work
madd<<<nblocks,blocksize>>>mAdd(A,B,C,n);
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我从上面的链接开始我的问题,因为它部分回答了我的第一个问题.如果这不是在Stack Overflow上提问的正确方法,请原谅或建议我.
我有一个矩形网格.这些矩形中的每一个都由矩形网格点组成.矩形内的所有点都可以通过内核中完全相同的指令序列来处理.我将能够启动一个具有10000个点的内核来处理,其中每个线程将处理大约10-50个点.然而,矩形的边缘和角上的点将导致大量不同的指令序列.
从设计的角度来看,使用相同的指令序列为每组点启动内核会更容易.这意味着一些内核启动只会处理非常少的点,可能少于10.
所以我可能有4个内核启动,10000个点可以处理(每个线程10-50个点),也许30-100个内核启动,每个只有几个点(通常每个线程1个点).
我完全不知道这是否可以接受,或者它是否会完全破坏我的表现.我很高兴你能给我一个粗略的估计或至少一些提示,考虑什么来估计.