cuda性能优化中的思考,如果grid中的总线程数超过了每个SM最大线程数 * GPU SM数量,会发生什么呢?会有任务排队么?另外相比较刚好用完GPU总的最大线程数,会有额外的性能开销么

如题。
cuda性能优化中的思考,如果grid中的总线程数超过了每个SM最大线程数 * GPU SM数量,会发生什么呢?会有任务排队么?另外相比较刚好用完GPU总的最大线程数,会有额外的性能开销么
grid网格大小设置在最大值范围内,是不是越大越好呢。先不考虑其他因素,比如访存,利用率等。
一个SM最大支持的warp数量是有限的,新的warp加载进来,相比在一个warp里完成多次计算,性能怎么样?

Hi @user2176

欢迎访问我们的开发者论坛!已经看到您的问题了,我转给相关的同事看一下。

  1. grid中的总线程数超过了每个SM最大线程数 * GPU SM数量,会发生什么呢?
    在编译时就会报错,在你写CUDA程序之前,可以使用device query sample查看一下,可以设置的grid dim 在三个维度上的最大数。当然你这个问题不一定能表达你的想法,你可能想问如果线程总数超过了GPU所有的核心数量,那么没关系,而且很正常。toolkit 会帮你自动处理,底层会将这些线程安排好一个队列,然后执行的时候,有些线程处于等待状态,有些线程可能在加载数据,有些线程可能在执行指令计算,它会尽量保持一种Busy状态。并不会有额外的开销,或者说即使有也非常小。
  2. grid网格大小设置在最大值范围内,是不是越大越好呢。先不考虑其他因素,比如访存,利用率等。
    当然不是,比如你要计算个向量加法,有10个元素,你用10000个线程,那么会浪费很多线程,因为程序必须在所有线程都执行完毕在结束。再举一个例子,你有10000个元素,做累加,如果你分配到很多个sm中,那么就要行程最后在global memory中进行累加,你可以用2pass的方法或者原子计算。但是,如果你合理的分配下,让他们在一个sm中,使用寄存器进行累加,可能反而更快。而且吧,CUDA编程你要说效率,没法不考虑访存。
  3. 一个SM最大支持的warp数量是有限的,新的warp加载进来,相比在一个warp里完成多次计算,性能怎么样?
    没有任何指标能说明哪种更好,跟数据规模,算法结构等息息相关,必须要进行实验或者用profiler工具查看一下
1 个赞

哦哦,我没有表述清楚。
比如4080,一个SM最大的线程数是1536,76个SM最大的线程数761536。实际kernel中的线程数是超过这个线程数的,那是怎么处理的呢。也即一个SM最大的warp数是48,76个SM最大的warp数是7648=3648,实际中的warp数是大于这个3648,那网格里其他的warp会排队处理么

如果是排队处理的,那相比较刚好用完最大的warp数,在warp里面循环处理,warp的排队处理时需要加载进来,这个额外的开销不大是么?