关于block和warp的一个问题

小弟有个疑问:“既然block中线程被组织成warp,那么只考虑block的数量是否是32的倍数不就行了嘛~为什么还要劳心劳力设计block的维度?”

因为某些函数,它的反函数的计算代价比它自己要高很多。

例如 y = JJJP * x; 是一个y在x上的函数,其中JJJP是一个运行时候才能确定的常数。

而它的反函数 x = y / JJJP; 的除法运算的代价在N卡上要比它原本的乘法高很多。虽然这2个式子是等价的。

而回到我们的问题,为何不只能说block里有多少多少线程(例如N个),而却需要指定一个形状,使得这个形状的三个分量的乘积是这个N呢?这就如同上面所说的,运算的代价:

一个kernel可能需要一些2个维度,3个维度上的参数信息,从而决定自己的运算对象和结果对象,甚至自己的运算操作。而这个信息直接从(x,y,z)的block shape里取得,或者简单的乘法、加法运算下取得,要比从一个(N,1,1)上做昂贵除法运算取得要合算的多。所以大家往往喜欢根据算法要求,给出形状。

例如,一个kernel的block工作与一个7 * 5 * 6的数组上,那么此时直接(7,5,6)的block shape, 然后每个线程直接就知道自己的参数是(threadIdx.x, threadIdx.y, threadIdx.z), 岂不是很方便?

反之,如果盲目的只给出了block里有210个线程,大家还得用求出((tid % 35) % 7, (tid % 35) /7 , tid /35)之类的神马操作,岂非舍近求远了?

望楼主三思。

谢谢哦,很详细