cuda问题
OnGPU2D <<< grid, block >>>(d_MatA, d_MatB, d_MatC);
这里面的两个参数怎么规划才能让程序高效的运行 展开
这个就需要根据实际情况而定了,有以下几个基本原则:
block参数指的其实是一个block里面有几个thread,这个数目一般都要是2的幂,最常用的是64,128,256,最大值是1024,但是很少用到512以上,因为考虑到每个thread本身寄存器数目的限制和每个block的共享内存(shared memory)限制,太大的block会使GPU占用率(occupancy)下降
grid参数指的是一个grid中部署多少个block。这个参数一般是根据你如何划分block来确定的。例如,你要处理一个5000 x 5000的矩阵,你每个block设置了16 x 16=256个thread,那么满足这个设置的最少的grid中的block的数量可以这么计算: grid((5000+16-1)/16, (5000+16-1)/16),其实也就是一个ceil运算,一共grid一共需要上述所说的这么的blocks才能完成运算。当然最后一个block可能会有没有用上的thread,因为5000不能整除16。这个就需要你在kernel里面有一个if语句来控制一下,也就是(if (x<5000 && y<5000)其中x、y分别为x、y方向上的索引
你要知道一些基本原则,例如每个block最大的shared memory的大小可以到64K,每个thread自身的寄存器最多可以到63个,如果超过这些限制,GPU在一个grid中就办法部署整个计算,会用到第二个甚至第三个。这样其实有很大一部分GPU的运算能力是被浪费掉了。
推荐你看一本书:Programming Massively Parallel Processors,网上有电子版的,这个入门很好!谢谢