【问题标题】:cuda: Any efficient way to get non-zero elements in sparse matrixcuda:在稀疏矩阵中获取非零元素的任何有效方法
【发布时间】:2013-12-07 10:45:47
【问题描述】:

我有一个大的 2D 直方图,其中大部分元素为零。我想将非零值及其位置放入 2 个数组(或向量)。有什么有效的方法吗?

我希望已经清楚地说明了我的问题。这里有一些细节。

1) 我有一个 1024*1024 的直方图,并由 atomicAdd() 填充。 2)对于直方图中的每个元素,如果不是局部峰值,则将其内容设置为0。(通常我有

希望您的建议,提前谢谢。

【问题讨论】:

  • 您可以使用前缀和(扫描)或推力的for_each
  • 让我感到奇怪的是,我似乎无法在 cuSPARSE 中找到密集到稀疏的向量转换原语。
  • @Domi - 这个和相关的功能怎么样? docs.nvidia.com/cuda/cusparse/…

标签: matrix cuda


【解决方案1】:

推力histogram example 应该会给你一些想法。

术语可能会令人困惑:那里描述的“密集直方图”包含所有箱,无论是否为零(相当于您的稀疏矩阵)。 “稀疏直方图”仅包含非零箱,相当于您想要的结果。

该示例实际上生成了直方图——密集的或稀疏的。因此,您可能希望直接使用该方法,而不是使用任何方法来进行直方图(AtomicAdd,虽然功能强大,但可能会更慢。)

或者,如果您愿意,该代码中的 cmets 会描述如何将“密集”转换为“稀疏”,反之亦然。建议创建稀疏直方图(这是您想要的)推力copy_if

由于您需要直方图 bin 和它的索引,您可以执行以下操作:

  1. 创建一个与您的直方图向量一样长的向量,并对其进行排序 (thrust::sequence) 以创建索引。
  2. 创建一个 zip 迭代器以将每个直方图 bin 及其对应的索引组合成一个元组。
  3. 使用 copy_if 选择 bin 值非零的元组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多