怎样查看GPU能支持多少个CommandQueue同时运行?

  • 4 replies
  • 280 views
怎样查看GPU能支持多少个CommandQueue同时运行?
« 于: 九月 17, 2019, 04:44:17 pm »
新手求助解惑
RT, 假设1个GPU有16个计算单元,每个单元有32个核。

设计一个kernel只占用1个work item(1个核?)运行死循环,那么我开512(16*32)个CommandQueue,每个CommandQueue都提交这个kernel,最多能有多少个kernel同时运行呢?不同GPU是不是不一样?有没有命令可以查询这个数值?

谢谢!
« 最后编辑时间: 九月 17, 2019, 04:45:37 pm 作者 santino »

Re: 怎样查看GPU能支持多少个CommandQueue同时运行?
« 回复 #1 于: 九月 18, 2019, 12:53:45 pm »
新手求助解惑
RT, 假设1个GPU有16个计算单元,每个单元有32个核。

设计一个kernel只占用1个work item(1个核?)运行死循环,那么我开512(16*32)个CommandQueue,每个CommandQueue都提交这个kernel,最多能有多少个kernel同时运行呢?不同GPU是不是不一样?有没有命令可以查询这个数值?

谢谢!

具体一个GPU能同时在卡上执行的kernel数量,和具体的硬件有关的。

但你的假设的应用场景不存在,与其1次kernel启动只有1个work-item,启动512次;不如直接考虑启动1次512个work-items的规模,你说呢。

关于你的第三个问题,目前没有直接能查询到这个数值的命令或者说设备属性。但常见GPU有32个,128个(这两个是N家的),以及,64个(A家的,GCN 1.1/2). AMD稍微有点文档可以看ACE的数量,以及每个ACE支持的队列数量之类的信息。(但如同上一段说的,这没必要,你应当考虑一次性启动更大规模,而不是考虑卡能否支持多次启动的kernel在并发)

Re: 怎样查看GPU能支持多少个CommandQueue同时运行?
« 回复 #2 于: 九月 18, 2019, 02:36:09 pm »
具体一个GPU能同时在卡上执行的kernel数量,和具体的硬件有关的。

但你的假设的应用场景不存在,与其1次kernel启动只有1个work-item,启动512次;不如直接考虑启动1次512个work-items的规模,你说呢。

关于你的第三个问题,目前没有直接能查询到这个数值的命令或者说设备属性。但常见GPU有32个,128个(这两个是N家的),以及,64个(A家的,GCN 1.1/2). AMD稍微有点文档可以看ACE的数量,以及每个ACE支持的队列数量之类的信息。(但如同上一段说的,这没必要,你应当考虑一次性启动更大规模,而不是考虑卡能否支持多次启动的kernel在并发)

非常感谢您的答复。其实我主要想了解GPU的最小工作单位是什么?各个work-item是否能独立工作,还是不管任务多小,一次都会占据一整个计算单元,甚至整个GPU?

我想投递多个queue的原因是担心kernel在某些参数下运行时间过长,导致同一批任务被其中一个拖后腿(比如平均一个任务3毫秒,千分之一的可能性需要2-3秒,跑百万个批次的任务就会造成极大延时),所以想分开跑,提高运行通量。可能想法幼稚了:P
« 最后编辑时间: 九月 18, 2019, 02:43:03 pm 作者 santino »

Re: 怎样查看GPU能支持多少个CommandQueue同时运行?
« 回复 #3 于: 九月 18, 2019, 05:06:34 pm »
非常感谢您的答复。其实我主要想了解GPU的最小工作单位是什么?各个work-item是否能独立工作,还是不管任务多小,一次都会占据一整个计算单元,甚至整个GPU?

我想投递多个queue的原因是担心kernel在某些参数下运行时间过长,导致同一批任务被其中一个拖后腿(比如平均一个任务3毫秒,千分之一的可能性需要2-3秒,跑百万个批次的任务就会造成极大延时),所以想分开跑,提高运行通量。可能想法幼稚了:P

这些都属于基本问题:
(1)请看一下N卡或者A卡的基本架构。手册均在网上公开可用。你得学会自学基本的常识。注意N卡的架构是用CUDA的术语来说的(例如线程,例如块,而不是你常见的work-item或者group之类的)。

(2)你可以认为一个kernel的启动规模较大(分别是CUDA或者OCL的grid或者ndrange)。但其中的最小调度单位(执行单位),往往是warp或者wavefront, 请自行搜索这两个是什么。而资源占用的单位往往是block或者group(也请自行搜索)。当某个kernel中有1个warp/wave迟迟不能结束的时候(这叫long-tail,也就是长尾/拖尾效应),最多只会有1个block或者group的资源被占用。而关于GPU如何具体blocks/groups上去执行的(这往往叫驻留,resident), 也请自行搜索。

(3)可以将多个kernel并发执行作为解决长尾效应的一种方式,这没错。但不能作为一种常规的并行手段(你并行的是work-items,而尽量不要是kernels)。

Re: 怎样查看GPU能支持多少个CommandQueue同时运行?
« 回复 #4 于: 九月 20, 2019, 03:58:34 pm »
这些都属于基本问题:
(1)请看一下N卡或者A卡的基本架构。手册均在网上公开可用。你得学会自学基本的常识。注意N卡的架构是用CUDA的术语来说的(例如线程,例如块,而不是你常见的work-item或者group之类的)。

(2)你可以认为一个kernel的启动规模较大(分别是CUDA或者OCL的grid或者ndrange)。但其中的最小调度单位(执行单位),往往是warp或者wavefront, 请自行搜索这两个是什么。而资源占用的单位往往是block或者group(也请自行搜索)。当某个kernel中有1个warp/wave迟迟不能结束的时候(这叫long-tail,也就是长尾/拖尾效应),最多只会有1个block或者group的资源被占用。而关于GPU如何具体blocks/groups上去执行的(这往往叫驻留,resident), 也请自行搜索。

(3)可以将多个kernel并发执行作为解决长尾效应的一种方式,这没错。但不能作为一种常规的并行手段(你并行的是work-items,而尽量不要是kernels)。

非常感谢!我去研究一下。