注意

RAFT 中的向量搜索和聚类算法正在迁移到一个新的专注于向量搜索的库中,该库名为 cuVS。在此迁移过程中,我们将继续支持 RAFT 中的向量搜索算法,但在 RAPIDS 24.06 (六月) 版本发布后将不再更新它们。我们计划在 RAPIDS 24.10 (十月) 版本发布前完成迁移,并在 RAPIDS 24.12 (十二月) 版本中完全从 RAFT 中移除。

稀疏矩阵操作#

template<typename T, typename idx_t, typename nnz_t>
void raft::sparse::op::coo_remove_scalar(const idx_t *rows, const idx_t *cols, const T *vals, nnz_t nnz, idx_t *crows, idx_t *ccols, T *cvals, nnz_t *cnnz, nnz_t *cur_cnnz, T scalar, idx_t n, cudaStream_t stream)#

从 COO 格式的稀疏矩阵中移除与特定标量匹配的值。

参数:
  • rows – 输入行数组 (大小 n)

  • cols – 输入列数组 (大小 n)

  • vals – 输入值数组 (大小 n)

  • nnz – 当前行/列/值数组的大小

  • crows – 压缩行数组

  • ccols – 压缩列数组

  • cvals – 压缩值数组

  • cnnz – 每行的非零计数数组

  • cur_cnnz – 每行的计数数组

  • scalar – 要从数组中移除的标量

  • n – 稠密矩阵中的行数

  • stream – 要使用的 cuda stream

template<typename T, typename idx_t, typename nnz_t>
void raft::sparse::op::coo_remove_scalar(COO<T, idx_t, nnz_t> *in, COO<T, idx_t, nnz_t> *out, T scalar, cudaStream_t stream)#

从 COO 格式的稀疏矩阵中移除与特定标量匹配的值。

参数:
  • in – 输入 COO 矩阵

  • out – 输出 COO 矩阵

  • scalar – 要从数组中移除的标量

  • stream – 要使用的 cuda stream

template<typename T, typename idx_t, typename nnz_t>
void raft::sparse::op::coo_remove_zeros(COO<T, idx_t, nnz_t> *in, COO<T, idx_t, nnz_t> *out, cudaStream_t stream)#

从 COO 格式的稀疏矩阵中移除零。

参数:
  • in – 输入 COO 矩阵

  • out – 输出 COO 矩阵

  • stream – 要使用的 cuda stream

template<typename value_idx>
void raft::sparse::op::compute_duplicates_mask(value_idx *mask, const value_idx *rows, const value_idx *cols, size_t nnz, cudaStream_t stream)#

从一个已排序的 COO 矩阵计算掩码,其中 0 表示重复值,1 表示新值。这个掩码可用于计算一个独占扫描(exclusive scan),以便预先构建偏移量来减少重复项,例如在对称化或获取每个重复值的最小值时。

请注意,此函数始终将第一个值标记为 0,以便后续可以执行累积求和。然而,即使直接使用此掩码,任何重复项在首次遇到时应始终为 1,因此可以假定第一个元素在其他情况下也始终为 1。

模板参数:

value_idx

参数:
  • mask[输出] 输出掩码,大小为 nnz

  • rows[输入] COO 行数组,大小为 nnz

  • cols[输入] COO 列数组,大小为 nnz

  • nnz[输入] 输入数组中的非零个数

  • stream[输入] cuda 操作将相对于此 stream 进行排序

template<typename value_idx, typename value_t, typename nnz_t>
void raft::sparse::op::max_duplicates(raft::resources const &handle, raft::sparse::COO<value_t, value_idx, nnz_t> &out, const value_idx *rows, const value_idx *cols, const value_t *vals, nnz_t nnz, value_idx m, value_idx n)#

对每行的重复列执行 COO 归约,取每行重复列的最大权重。此函数假定输入的 COO 已按行和列排序,但不假定值的排序。

模板参数:
  • value_idx

  • value_t

参数:
  • handle[输入]

  • out[输出] 输出 COO,nnz 将在此函数中计算并调用 allocate() 进行分配。

  • rows[输入] COO 行数组,大小为 nnz

  • cols[输入] COO 列数组,大小为 nnz

  • vals[输入] COO 值数组,大小为 nnz

  • nnz[输入] COO 输入数组中的非零个数

  • m[输入] COO 输入矩阵中的行数

  • n[输入] COO 输入矩阵中的列数

template<typename Index_> void void raft::sparse::op::csr_row_op (const Index_ *row_ind, Index_ n_rows, Index_ nnz, Lambda op, cudaStream_t stream)

对 CSR 矩阵按批次执行自定义行操作。

模板参数:
  • T – row_ind 数组的数值类型

  • TPB_X – 底层 kernel 要使用的每个块的线程数

  • Lambda – 自定义操作函数的类型

参数:
  • row_ind – 要对其执行并行操作的 CSR row_ind 数组

  • n_rows – 图中的总顶点数

  • nnz – 非零个数

  • op – 接受行和起始索引的自定义行操作函数对象。

  • stream – 要使用的 cuda stream

template<typename value_idx>
void raft::sparse::op::csr_row_slice_indptr(value_idx start_row, value_idx stop_row, const value_idx *indptr, value_idx *indptr_out, value_idx *start_offset, value_idx *stop_offset, cudaStream_t stream)#

从 CSR 数组中切片连续的行,并填充新的切片 indptr 数组

模板参数:

value_idx

参数:
  • start_row[输入] : 切片的起始行

  • stop_row[输入] : 切片的结束行

  • indptr[输入] : 要切片的输入 CSR 的 indptr

  • indptr_out[输出] : 要填充的输出切片 indptr

  • start_offset[输入] : 输入 indptr 的起始列偏移量

  • stop_offset[输入] : 输入 indptr 的结束列偏移量

  • stream[输入] : 用于排序事件的 cuda stream

template<typename value_idx, typename value_t>
void raft::sparse::op::csr_row_slice_populate(value_idx start_offset, value_idx stop_offset, const value_idx *indices, const value_t *data, value_idx *indices_out, value_t *data_out, cudaStream_t stream)#

从 CSR 切片行,填充列和数据数组

模板参数:
  • value_idx – : CSR 索引数组的数据类型

  • value_t – : CSR 数据数组的数据类型

参数:
  • start_offset[输入] : 切片的起始列偏移量

  • stop_offset[输入] : 切片的结束列偏移量

  • indices[输入] : 来自输入 CSR 的列索引数组

  • data[输入] : 来自输入 CSR 的数据数组

  • indices_out[输出] : 输出列索引数组

  • data_out[输出] : 输出数据数组

  • stream[输入] : 用于排序事件的 cuda stream

template<typename T, typename IdxT = int, typename nnz_t>
void raft::sparse::op::coo_sort(IdxT m, IdxT n, nnz_t nnz, IdxT *rows, IdxT *cols, T *vals, cudaStream_t stream)#

按行然后按列对组成 coo 矩阵的数组进行排序。

参数:
  • m – coo 矩阵中的行数

  • n – coo 矩阵中的列数

  • nnz – 非零个数

  • rows – 来自 coo 矩阵的行数组

  • cols – 来自 coo 矩阵的列数组

  • vals – 来自 coo 矩阵的值数组

  • stream – 要使用的 cuda stream

template<typename T, typename IdxT = int, typename nnz_t>
void raft::sparse::op::coo_sort(COO<T, IdxT, nnz_t> *const in, cudaStream_t stream)#

按行对底层 COO 数组进行排序。

模板参数:

T – 底层值数组的类型名称

参数:
  • in – 要按行排序的 COO

  • stream – 要使用的 cuda stream

template<typename value_idx, typename value_t, typename nnz_t>
void raft::sparse::op::coo_sort_by_weight(value_idx *rows, value_idx *cols, value_t *data, nnz_t nnz, cudaStream_t stream)#

按权重对 COO 进行排序

模板参数:
  • value_idx

  • value_t

参数:
  • rows[输入/输出] 源边

  • cols[输入/输出] 目标边

  • data[输入/输出] 边权重

  • nnz[输入] 边列表中的边数

  • stream[输入] 用于排序 cuda 操作的 cuda stream