Tan*_*nay 5 parallel-processing cuda
我正在从Udacity的并行编程课程中学习CUDA .在测验中,他们有一个排序预先排序的变量(玩家的身高)的问题.因为,它是输入和输出数组之间的一对一对应,它不应该是一个Map
通信模式而不是一个Scatter
?
我所知道的,CUDA没有对这些术语进行规范定义.因此,我的答案仅仅是对它如何被解释或被解释的建议.
"因为,它是输入和输出数组之间的一对一"
图表似乎不支持此语句,该图表显示输出数组中的间隙,这些间隙没有与之关联的相应输入点.
如果将较小的一组值分配到较大的数组中(因此在输出数组中产生间隙,因此没有输入值对应于间隙位置),则可以使用分散来描述该操作.散点图和贴图都有描述输入值所在位置的映射,但可能是指导者已经定义了散点图和贴图,以便区分这两种情况,例如以下似是而非的定义:
分散:从输入到输出的一对一关系(即单向关系).每个输入位置都有相应的输出位置,但并非每个输出位置都有相应的输入位置.
Map:输入和输出之间的一对一关系(即双向关系).每个输入位置具有相应的输出位置,并且每一个输出位置具有相应的输入位置.
收集:从输出到输入的一对一关系(即单向关系).每个输出位置都有一个相应的输入位置,但并非每个输入位置都有相应的输出位置.
小智 5
每种通信模式(映射、分散、收集等)的定义从一种语言/环境/上下文到另一种略有不同,但由于我遵循了相同的 Udacity 课程,因此我将尝试按照我的理解解释该术语课程背景:
该Map
操作计算每个输出元素作为其对应输入元素的函数,即:
output[tid] = foo(input[tid]);
Run Code Online (Sandbox Code Playgroud)
该Gather
模式将每个输出元素计算为一个或多个(通常更多)输入元素的函数,不一定是对应的元素(通常这些是来自邻域的元素)。例如:
output[tid] = (input[tid-1] + input[tid+1]) / 2;
Run Code Online (Sandbox Code Playgroud)
最后,该Scatter
操作使每个输入元素对一个或多个(通常是更多)输出元素有贡献。例如,
atomicAdd( &(output[tid-1]), input[tid]);
atomicAdd( &(output[tid]), input[tid]);
atomicAdd( &(output[tid+1]), input[tid]);
Run Code Online (Sandbox Code Playgroud)
问题中给出的示例显然不是Map,因为每个输出都是根据不同位置的输入计算得出的。
此外,很难看出同一个示例如何成为分散的,因为每个输入元素只会导致对输出的一次写入,但它确实是一种分散,因为每个输入都会导致对输出的写入,其位置由输入决定.
换句话说,每个 CUDA 线程在与其tid
(线程 ID 号)关联的位置处理输入元素,并计算将结果写入何处。更常见的是,分散会写在几个地方而不是一个地方,所以这是一个特殊的情况,可能会以不同的方式命名。