Matrix cuda:在稀疏矩阵中获取非零元素的任何有效方法

Matrix cuda:在稀疏矩阵中获取非零元素的任何有效方法,matrix,cuda,Matrix,Cuda,我有一个很大的2D直方图,其中大部分元素为零。我想把非零一和它们的位置放在2个数组(或向量)中。有什么有效的方法可以做到这一点吗 我希望你能把我的问题说清楚。这里有一些细节 1) 我有一个1024*1024的直方图,由atomicAdd()填充。 2) 对于直方图中的每个元素,如果不是局部峰值,则其内容设置为0。(通常我有这篇文章会给你一些想法 术语可能会让人困惑:这里描述的“密集直方图”包含所有存储单元,无论是否为零(相当于稀疏矩阵),“稀疏直方图”仅包含非零存储单元,相当于所需的结果 该示例

我有一个很大的2D直方图,其中大部分元素为零。我想把非零一和它们的位置放在2个数组(或向量)中。有什么有效的方法可以做到这一点吗

我希望你能把我的问题说清楚。这里有一些细节

1) 我有一个1024*1024的直方图,由atomicAdd()填充。 2) 对于直方图中的每个元素,如果不是局部峰值,则其内容设置为0。(通常我有这篇文章会给你一些想法

术语可能会让人困惑:这里描述的“密集直方图”包含所有存储单元,无论是否为零(相当于稀疏矩阵),“稀疏直方图”仅包含非零存储单元,相当于所需的结果

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

或者,如果您愿意,代码中的注释将说明如何将“密集”转换为“稀疏”,反之亦然。建议创建稀疏直方图(这是您想要的)

由于您需要直方图箱及其索引,因此可以执行以下操作:

  • 创建一个与直方图向量一样长的向量,并对其排序(
    asch::sequence
    )以创建索引
  • 创建一个zip迭代器,将每个直方图单元及其对应的索引组合成一个元组
  • 使用copy_if选择bin值非零的元组
  • 主旨应该会给你一些想法

    术语可能会让人困惑:这里描述的“密集直方图”包含所有存储单元,无论是否为零(相当于稀疏矩阵),“稀疏直方图”仅包含非零存储单元,相当于所需的结果

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

    或者,如果您愿意,代码中的注释将说明如何将“密集”转换为“稀疏”,反之亦然。建议创建稀疏直方图(这是您想要的)

    由于您需要直方图箱及其索引,因此可以执行以下操作:

  • 创建一个与直方图向量一样长的向量,并对其排序(
    asch::sequence
    )以创建索引
  • 创建一个zip迭代器,将每个直方图单元及其对应的索引组合成一个元组
  • 使用copy_if选择bin值非零的元组

  • 您可以使用前缀和(扫描)或推力。我觉得奇怪的是,在cuSPARSE中似乎找不到稠密到稀疏向量转换原语。@Domi-这个函数和相关函数如何?您可以使用前缀和(扫描)我觉得奇怪的是,在cuSPARSE中似乎找不到稠密到稀疏的向量转换原语。@Domi-这个函数和相关函数怎么样?