CUDA:分散沟通模式

时间:2015-01-10 09:16:24

标签: cuda parallel-processing

我正在学习Udacity' course关于并行编程的CUDA。在测验中,他们有一个排序预先排序的变量(玩家的身高)的问题。因为它是输入和输出数组之间的一对一对应,它不应该是Map通信模式而不是Scatter吗? enter image description here

3 个答案:

答案 0 :(得分:6)

CUDA没有对这些术语进行规范定义,我知道。因此,我的答案仅仅是对它如何被解释或被解释的建议。

"因为,它是输入和输出数组之间的一对一关系"

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

如果将较小的一组值分配到一个较大的数组中(因此在输出数组中产生间隙,因此没有输入值对应于间隙位置),那么散射可能用于描述该操作。散点图和贴图都有描述输入值所在位置的映射,但可能是指导者已经定义了散射和贴图,以便区分这两种情况,例如以下似是而非的定义:

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

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

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

答案 1 :(得分:4)

每种通信模式的定义(地图,分散,聚集等)从一种语言/环境/上下文到另一种语言/环境/上下文略有不同,但由于我遵循相同的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号)相关联的位置处的输入元素,并计算写入结果的位置。更常见的是,分散会写在几个地方而不是一个地方,所以这是一个特殊的情况,可能也有不同的名称。

答案 2 :(得分:0)

每位玩家有3个属性(名称,身高,等级)。 所以我认为分散是正确的,因为我们应该考虑这三件事来做出输出。

如果玩家只有一个像排名这样的属性, 那么地图是正确的我认为。

reference: Parallel Communication Patterns Recap in this lecture

reference: map/reduce/gather/scatter with image