CUDA:分散通信模式

CUDA: Scatter communication pattern

我正在从 Udacity 的 course 并行编程学习 CUDA。在一个测验中,他们给定了一个 pre-ranked 变量(玩家的身高)排序的问题。既然是输入输出数组的one-one对应关系,那不应该是Map通信模式而不是Scatter吗?

据我所知,CUDA 没有对这些术语做出规范定义。因此,我的回答只是对它可能如何解释或已经被解释的建议。

"Since, it is a one-one correspondence between input and output array"

图表似乎不支持此声明,该图表显示输出数组中的间隙,这些间隙没有与之关联的相应输入点。

如果较小的一组值分布到较大的数组中(因此在输出数组中产生空隙,其中没有输入值对应于空隙位置),则 scatter 可用于描述该操作。散点图和地图都有描述输入值去向的地图,但可能是讲师以区分这两种情况的方式定义了散点图和地图,例如以下似是而非的定义:

分散:一对一关系从输入到输出(即单向关系)。每个输入位置都有对应的输出位置,但不是每个输出位置都有对应的输入位置。

映射:一对一关系输入和输出之间(即双向关系)。每个输入位置都有一个对应的输出位置,并且每个输出位置都有一个对应的输入位置。

收集:一对一关系从输出到输入(即单向关系)。每个输出位置都有对应的输入位置,但不是每个输入位置都有对应的输出位置。

每种通信模式(地图、分散、聚集等)的定义在 language/environment/context 之间略有不同,但由于我学习了相同的 Udacity 课程,我将尝试解释该术语据我在课程上下文中的理解:

Map 运算将每个输出元素计算为其 对应的 输入元素的函数,即:

output[tid] = foo(input[tid]);

Gather 模式将每个输出元素计算为一个或多个(通常是多个)输入元素的函数,不一定是相应的输入元素(通常这些是来自邻域的元素)。例如:

output[tid] = (input[tid-1] + input[tid+1]) / 2;

最后,Scatter 操作让每个输入元素 贡献给 一个或多个(同样,通常更多)输出元素。例如,

atomicAdd( &(output[tid-1]), input[tid]);
atomicAdd( &(output[tid]),   input[tid]);
atomicAdd( &(output[tid+1]), input[tid]);

问题中给出的示例显然不是地图,因为每个输出都是根据不同位置的输入计算的。

另外,很难看出同一个例子怎么会是一个散点,因为每个输入元素只导致一次写入输出,但它确实是一个散点,因为每个输入都会导致写入一个输出,其位置由输入决定。

换句话说,每个 CUDA 线程在与其 tid(线程 ID 号)关联的位置处处理输入元素,并计算将结果写入何处。更常见的是一个散点图会写在几个地方而不是一个地方,所以这是一个特殊情况,不妨以不同的方式命名。

每个球员都有 3 个属性(姓名、身高、排名)。 所以我认为scatter是正确的,因为我们应该考虑这三个东西来做输出。

如果玩家只有一个属性喜欢的等级, 那么我认为地图是正确的。

reference: Parallel Communication Patterns Recap in this lecture

reference: map/reduce/gather/scatter with image