【问题标题】:CUDA Stream compaction: understanding the conceptCUDA Stream compaction:理解概念
【发布时间】:2012-01-13 08:37:25
【问题描述】:

我正在使用 CUDA/Thrust/CUDPP。据我了解,在流压缩中,数组中的某些项目被标记为无效,然后被“删除”。

现在“移除”在这里的真正含义是什么?假设原始数组 A 长度为 6。如果 2 个元素无效(无论我们提供什么条件),那么

  1. 系统是否在 GPU 内存中创建一个大小为 4 的 数组来存储有效元素以获得最终结果?

  2. 或者它是否从内存中物理删除无效元素并缩小原始数组 缩小到 4 只保留有效元素?

对于任何一种情况,这是否意味着动态内存分配是在后台进行的? 但我听说动态内存分配在 CUDA 世界中是不可能的。

【问题讨论】:

  • 还有一种可能,就是内存分配的大小不变,前4个元素有效,后2个未定义。但实际上这个问题都是关于实现问题的,谁说 CUDPP 或推力是一样的?
  • ArrayFire 是比 Thrust 更好/更简单的选择,而且也是免费的,至少对于单 GPU 使用而言是这样。 accelereyes.com/arrayfire

标签: algorithm cuda gpu thrust cudpp


【解决方案1】:

首先,CUDA 在 Compute Capability 2.0 及更高版本的设备上可以进行动态内存分配。 CUDA 运行时库支持 __device__ 函数中的 malloc/free 和 new/delete。但这与答案无关,真的。

通常会提供足够大的输出数组(预先分配,通常与输入数组大小相同)并将输出写入其中。不需要动态分配,但存在潜在的存储浪费。这就是 CUDPP 和推力所做的。另一种方法是首先执行有效元素的计数,然后使用从主机 CPU 调用的 cudaMalloc 动态分配输出 GPU 内存。

【讨论】:

  • 这不是 Thrust 所做的 :) Thrust 中的压缩算法(例如,thrust::copy_if)通常要求输出缓冲区。
  • 谢谢。编辑了我的答案。如果结果迭代器指向的分配不够大怎么办?有没有自动调整大小?
  • 否;如果迭代器指向的缓冲区不足,则行为未定义(即崩溃)。
猜你喜欢
  • 2017-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 2020-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多