总任务量确定,kernel外的循环次数越多越快or越少越快?

比如我要16384个线程,每个线程总共要计算27000个数(每个线程的任务之间不相关)

一种方法是,每次启动kernel,每个线程算500个数字,kernel启动54次(kernel外的循环,kernel结束以后同步一次)。

另外一个方法是每次启动kernel,每个线程算1000个数字,kernel启动27次,到底哪样快?

1:LZ提供的信息太笼统了,无法给出答案。

2:一般是先确定总的计算量,然后考虑相关性,然后考虑生成足够多的线程分发到GPU上去实现该算法,同时单个线程所需要的资源占用量在可接受的范围内。这里面有多个参数之间的平衡。

3:如果能完全在GPU端执行而不需要返回数据到HOST端,那么强烈建议直接在GPU端一直执行,最后再返回。

4:一般来说,启动kernel的代价很小,只要GPU端有较多的计算量,CPU端循环成百上千次地启动kernel都是无妨的。

5:最后,究竟是一个线程算上几百个数据,还是开上几百个线程,每个线程算一个数据,具体实现请LZ根据算法自行权衡,以及可以根据测试结果取舍。

稍微补充下

  • LZ说的情况不会直接导致性能问题。
  • 但值得注意,这可能因为使一个线程处理更多的数据导致每条线程使用的硬件资源增加,使得GPU内同时存在的active warp 数量减少,如果你的程序需要较多的active warp 这个变化会导致不能很好掩盖延迟而性能下降。
  • 另一方面分为更多的kernel相当于更多的同步,如果每个线程处理时间差异较大,同步可能会导致性能下降。