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的