GPU 每个SM上分配任务的问题

  • 9 replies
  • 208 views
GPU 每个SM上分配任务的问题
« 于: 十一月 19, 2019, 03:16:13 pm »
GPU小白,想请教一下各位。
GPU上是否可以指定每个SM上的任务,比如我需要在SM1跟SM2中运行不同算法(bfs,sssp),可以指定SM1做bfs, SM2做sssp么?

Re: GPU 每个SM上分配任务的问题
« 回复 #1 于: 十一月 19, 2019, 03:47:47 pm »
GPU小白,想请教一下各位。
GPU上是否可以指定每个SM上的任务,比如我需要在SM1跟SM2中运行不同算法(bfs,sssp),可以指定SM1做bfs, SM2做sssp么?

仅当在你的启动规模很小很小的时候,多个SM上,每个SM执行不同的kernel(即你的算法的实现)才有可能。

例如你的卡有4个SM,你启动了4个单block的kernel,每个block里面例如只有512个线程。此时的确可以像是你设想的那样,这种做法需要使用多个流,同时你还无法固定的将kernel映射到固定的SM编号上。例如本次可能是SM编号0执行了kernel a,SM 1执行了kernel b;下次就可能是SM 0执行b,SM 1却执行了a。一般的,要求固定的映射没意义。你说呢。

Re: GPU 每个SM上分配任务的问题
« 回复 #2 于: 十一月 19, 2019, 04:54:56 pm »
是这样的,我的多个作业需要访问一个共享的数据结构,该共享数据结构我想存在L2 cache中,然后每个作业有部分数据需要频繁访问,我想把这部分数据从L2 CACHE中放到shared memory。那么根据我的思路,假设每个SM中有一个shared memory,每个SM应该指定一个作业来对相应的shared memory进行处理。
不知道这么描述您是否看得明白,或者您有更好地思路可以提供。
感谢您的答复

Re: GPU 每个SM上分配任务的问题
« 回复 #3 于: 十一月 20, 2019, 01:05:08 pm »
是这样的,我的多个作业需要访问一个共享的数据结构,该共享数据结构我想存在L2 cache中,然后每个作业有部分数据需要频繁访问,我想把这部分数据从L2 CACHE中放到shared memory。那么根据我的思路,假设每个SM中有一个shared memory,每个SM应该指定一个作业来对相应的shared memory进行处理。
不知道这么描述您是否看得明白,或者您有更好地思路可以提供。
感谢您的答复

你这样就等于颠倒因果。

将一个较小的数据结果放在shared memory里无问题,但是不是选择让哪个SM上哪个kernel(的block),然后再安排上对应的数据。

而是当前看正在跑什么代码,然后根据代码(和相关的索引信息之类的)读取什么数据到shared memory。

你完全可以写死代码里面无条件的加载某些数据到当前的分配到的shared的,只要这段代码能执行到,则证明该SM上,执行的必然是这段代码,你说呢?

就如同你能够读到本帖子,证明你必然具有眼睛。

所以直接读取即可,你想的太多了。

Re: GPU 每个SM上分配任务的问题
« 回复 #4 于: 十一月 20, 2019, 03:38:09 pm »
感谢您的回复。
也就是说,我在代码中利用多个流定义好了不同任务需要执行的不同shared memory,任务会自动分配到其一SM上对相应的shared memory进行数据读取和计算对么。只是说我不能指定分配到哪一个SM,这个是系统自动分配的。
如果我上述理解正确的话,与之有关的还有一个问题想向您请教一下,每个任务(内核函数)作用的硬件平台是什么,是每个任务在一个SM中进行计算,还是根据情况跨多个SM进行计算?
感谢您的帮助

Re: GPU 每个SM上分配任务的问题
« 回复 #5 于: 十一月 20, 2019, 03:45:40 pm »
感谢您的回复。
也就是说,我在代码中利用多个流定义好了不同任务需要执行的不同shared memory,任务会自动分配到其一SM上对相应的shared memory进行数据读取和计算对么。只是说我不能指定分配到哪一个SM,这个是系统自动分配的。
如果我上述理解正确的话,与之有关的还有一个问题想向您请教一下,每个任务(内核函数)作用的硬件平台是什么,是每个任务在一个SM中进行计算,还是根据情况跨多个SM进行计算?
感谢您的帮助

关于第一部分,你的理解是正确的。既然你的某任务(某kernel)已经能执行到,按照该kernel里的代码的写法读取某数据,则进行读取的也必然是这段代码。这个问题实际上一般从来没有人迷惑过的。是显而易见的。动物中的人类能进化到写字的程度,则现在正在写字的你也必然是人类。

关于第二个情况,你的一次kernel启动,是通过二级的形状进行组织的,其中block级别的所有线程,都必须在同一个SM上,但是不同的blocks,则可以分别在不同的SM上分布,并行同时执行。这点手册上有提到。


Re: GPU 每个SM上分配任务的问题
« 回复 #6 于: 十一月 20, 2019, 05:15:39 pm »
您的意思是在一个GPU中一个任务往往是在多个SM上运行的对么,我在代码中定义了需要加载到shared meory中的数据k,之后系统自动的分配相应的部分数据(k1,k2,k3...)到每个SM上的shared memory上并行处理(k=k1+k2+k3+...),这也就是您所说的不同SM上的block并行对么
以及 二级的形状进行组织这句话我不是很理解,可以请您解释一下么

Re: GPU 每个SM上分配任务的问题
« 回复 #7 于: 十一月 20, 2019, 06:40:54 pm »
您的意思是在一个GPU中一个任务往往是在多个SM上运行的对么,我在代码中定义了需要加载到shared meory中的数据k,之后系统自动的分配相应的部分数据(k1,k2,k3...)到每个SM上的shared memory上并行处理(k=k1+k2+k3+...),这也就是您所说的不同SM上的block并行对么
以及 二级的形状进行组织这句话我不是很理解,可以请您解释一下么

(1)并不存在“系统自动分配数据到Shared Memory上的”,得你手工的用代码在你的kernel里读取数据,填充到shared memory的。
(2)二级组织结构是指你写<<<1000000, 128>>>这里的,类似这两个数(注意实际上是最多3D的)。第二级别指的是每个block内部的线程们,而第一级别则是指的blocks们。你也需要注意,逻辑上shared memory是属于block的,不建议初学者总是将他们看成SM的(否则你容易迷惑)。
(3)关于日常我们跑kernel的时候,并非是只用一个或者几个SM,更常见的情况是将所有的SM都压满了好几轮(例如刚才的1000000个blocks)。只有1个或者几个blocks的kernel比较少。



Re: GPU 每个SM上分配任务的问题
« 回复 #8 于: 十一月 20, 2019, 07:43:43 pm »
感谢您的耐心回答
如果一个任务在多个sm上并行处理,每个sm中都存在一定的shared memory,要是sm0 中shared memory的数据需要读取或写入到sm1 shared memory中的数据,应该怎么实现呢

Re: GPU 每个SM上分配任务的问题
« 回复 #9 于: 十一月 20, 2019, 11:26:49 pm »
您好,可能是我的问题描述不够清楚。
我现在的理解是对一个任务分配了shared memory,那么该任务应该在某个SM中的block上执行(并且由于SM上同一时刻只支持一组warp,因此warp需要在SM的不同block上来回切换)。那么按照这么理解,一个任务是不能够跨多个SM运行的(因为每个SM存在不同的shared memory)。可是我查资料发现block在SM中是平铺方式,那么一个小kernel将占据多个SM,,这种情况下是怎么做到使用不同SM上的shared memory的呢