这是一个关于如何确定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上提问的正确方法,请原谅或建议我.
我是CUDA范例的新手.我的问题是确定每个块的线程数和每个网格的块数.有点艺术和试验吗?我发现很多例子都是为这些东西选择了看似随意的数字.
我正在考虑一个问题,我可以将矩阵 - 任何大小 - 传递给乘法方法.因此,C的每个元素(如在C = A*B中)将由单个线程计算.在这种情况下,您如何确定线程/块,块/网格?
我们有一个安装了两个Nvidia Quadro FX 5800卡的工作站.运行deviceQuery CUDA示例显示每个多处理器(SM)的最大线程数为1024,而每个块的最大线程数为512.
鉴于每次只能在每个SM上执行一个块,为什么最大线程/处理器加倍最大线程/块?我们如何利用每个SM的其他512个线程?
Device 1: "Quadro FX 5800"
CUDA Driver Version / Runtime Version 5.0 / 5.0
CUDA Capability Major/Minor version number: 1.3
Total amount of global memory: 4096 MBytes (4294770688 bytes)
(30) Multiprocessors x ( 8) CUDA Cores/MP: 240 CUDA Cores
GPU Clock rate: 1296 MHz (1.30 GHz)
Memory Clock rate: 800 Mhz
Memory Bus Width: 512-bit
Max Texture Dimension Size (x,y,z) 1D=(8192), 2D=(65536,32768), 3D=(2048,2048,2048)
Max Layered Texture Size (dim) x layers 1D=(8192) x 512, 2D=(8192,8192) …Run Code Online (Sandbox Code Playgroud)