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

时间:2013-12-06 10:48:03

标签: matrix cuda

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

我希望明确说明我的问题。这是一些细节。

1)我有一个1024 * 1024的直方图,并由atomicAdd()填充。 2)对于直方图中的每个元素,如果它不是局部峰值,则将其内容设置为0.(通常我有<50个峰值)这样,我的直方图变成了一个大的稀疏矩阵。 3)我的问题是:我想将所有非零元素及其位置放到2个数组中。我不知道如何有效地做到这一点。

希望你的建议,谢谢你。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

既然你想要直方图bin和它的索引,你可以做类似以下的事情:

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