Concurrency 并行CUDA滤波器整数

Concurrency 并行CUDA滤波器整数,concurrency,cuda,Concurrency,Cuda,实现以下结果的标准(或事实上的任何工作)方法是什么: 给定uint32\u t的所有值,我想应用一个过滤函数(谓词?(uint32\u t->bool),以便只保留某些整数,并将它们保存到数组中。数组本身在\uuuuuuuuuuuuuuuuu常量内存中,但我想它可以移到通用\uuuuuuu设备内存中。接受的uint32\u ts的数量有一个实际上限,例如15000 我目前的解决方案是在\uuuu主机\uuuuu代码中执行此操作,其中涉及明显的for循环,但解决方案的速度非常慢。相反,我希望将此过

实现以下结果的标准(或事实上的任何工作)方法是什么:

给定
uint32\u t
的所有值,我想应用一个过滤函数(谓词?(
uint32\u t
->
bool
),以便只保留某些整数,并将它们保存到数组中。数组本身在
\uuuuuuuuuuuuuuuuu常量
内存中,但我想它可以移到通用
\uuuuuuu设备
内存中。接受的
uint32\u t
s的数量有一个实际上限,例如15000

我目前的解决方案是在
\uuuu主机\uuuuu
代码中执行此操作,其中涉及明显的
for
循环,但解决方案的速度非常慢。相反,我希望将此过滤实现为一个
\uuu全局
内核

我想到的解决方案是一个调用过滤函数的内核,并将阳性结果存储到一个数组中。它写入的索引需要以某种方式以原子方式递增。这就是任务的关键所在——我将如何在保持性能的同时确保并发正确性


我的代码是针对Jetson TX1的,因此计算能力是
5.3

最简单的解决方案是使用fastCUB设备原语。更具体地说,是其中之一。这一个维持秩序

或者,您可以使用您提到的基于原子的
解决方案,但请注意,不会保留顺序。此解决方案在具有少量SM的现代GPU上简单且相对快速,但在高端GPU上可能无法很好地扩展(因为SMs之间在原子上可能存在争用)

另一种选择是使用并行扫描。这个解决方案实现起来相当复杂(因此更容易出现bug),但要保持顺序。它可以比原子解决方案更快,并且应该扩展得更好(如果实现写得很巧妙的话)

最后,您可以使用阻塞共享内存来改进实现(尤其是并行扫描)。阻塞可以减少CUDA核心之间的争用和不必要的通信。如果您不是一名经验丰富的CUDA开发人员,则可以重用CUB的