比如我要16384个线程,每个线程总共要计算27000个数(每个线程的任务之间不相关)
一种方法是,每次启动kernel,每个线程算500个数字,kernel启动54次(kernel外的循环,kernel结束以后同步一次)。
另外一个方法是每次启动kernel,每个线程算1000个数字,kernel启动27次,到底哪样快?
比如我要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根据算法自行权衡,以及可以根据测试结果取舍。
稍微补充下