concurrency - CUDA 并行过滤整数
问题描述
实现以下结果的规范(或实际上任何工作)方式是什么:
给定 的所有值uint32_t
,我想应用一个过滤函数(谓词?)(uint32_t
-> bool
),以便只保留某些整数,并将它们保存到数组中。数组本身在__constant__
内存中,但我想它可以移动到通用__device__
内存中。接受的 s 的数量有一个实际的上限uint32_t
,例如 15000。
我目前的解决方案是在代码中执行此__host__
操作,其中涉及明显的for
循环,但该解决方案速度慢得不切实际。相反,我想将此过滤实现为__global__
内核。
我想到的解决方案是调用过滤函数并将正结果存储到数组中的内核。它写入的索引需要以某种方式原子地递增。这就是任务的关键所在——我将如何在保持性能的同时确保并发正确性?
我的代码针对 Jetson TX1,因此计算能力是5.3
.
解决方案
最简单的解决方案是使用快速CUB 设备原语。更具体地说是cub::DeviceSelect
. 这一项保持秩序。
或者,您可以使用您谈论的基于原子的解决方案,但请注意不会保留订单。这种解决方案在具有少量 SM 的现代 GPU 上简单且相对较快,但在高端 GPU 上可能无法很好地扩展(因为 SM 之间可能存在原子争用)。
另一种选择是使用并行扫描。这个解决方案实现起来非常复杂(因此更容易出错),但要保留 order。它可以比原子解决方案更快,并且应该可以更好地扩展(如果巧妙地编写了实现)。
最后,您可以利用阻塞和共享内存来改进您的实现(尤其是并行扫描)。阻塞可以减少 CUDA 核心之间的争用和不必要的通信。如果您不是经验丰富的 CUDA 开发人员,您可以重用 CUB 的块范围原语。
推荐阅读
- r - 系统错误(命令,实习生 = TRUE):找不到“C:\Program” selectWeka 函数
- c++ - 使用自定义凭据提供程序进行远程桌面连接
- mysql - 如何显示两个共享 id 的表的结果?
- c++ - std::is_same - 从integral_constant 继承函数的用例
- powershell - 使用 PowerShell 和新式身份验证连接到 Exchange Online(无任何依赖项)
- android - 如何为新创建的实例添加 Fragment 标签?
- php - PHP中如何让用户选择输出目录
- java - 队列实现不返回第一个元素
- r - 在 ggplot 中有多行(熔融数据)的工作日解决方法吗?
- python - Keras 多层神经网络精度