已关闭
新增 aclsparseSpvv 算子 #100
Hq创建于 7月15日关闭于 8月7日
7月15日 修改标题为 “新增 aclsparseSpvv 算子”,原标题为“新增aclsparseSpvv算子”
7月15日 关联了pull request:新增spvv算子和测试代码
wangzitao
7月15日 评论:
7月15日 评论:
您好,感谢反馈,问题确认和修复中。


7月15日 将 bjisdbvjhbsdvk 设为负责人
8月7日 issue状态由 进行中 改变为 已解决
8月7日 关闭了 issue
8月7日 添加了label:resolved
SPVV 算子
概述
ops-sparse 仓库中的 SPVV (Sparse Vector-Vector Dot Product) 算子实现了稀疏向量与稠密向量的点积运算:
result=i=0∑nnz−1x_values[i]⋅y[x_indices[i]]
其中 x 为稀疏向量(含 nnz 个非零元素,索引升序唯一),y 为稠密向量,结果恒为 FP32 标量。算子基于 aclsparse 统一接口。
支持的 AI 处理器
目录结构介绍
算子描述
功能
SPVV 算子计算稀疏向量 x 与稠密向量 y 的点积,结果为单个 FP32 标量。x 的非零元素由
(index, value)对表示,索引必须严格升序且唯一,取值范围[0, yLen-1]。支持的类型组合
实现原理
SpvvTilingData直接作为核函数参数传入,不走 device buffer。blockNum = ceil(nnz / nnzPerCore),每核处理连续一段 nnz;core 0 在 Init 置零 output,各核 partialSum 经SetAtomicAdd累加到 output GM,PipeBarrier<PIPE_ALL>确保 DMA 完成后再退出。YSLICE_MAX时单次加载 + 单次 Gather,跳过段循环。YSLICE_MAX分段,count 向下取整到ALIGN_ELEM(32B) 保证 Gather dst 偏移对齐,拼接进同一yGathered。idx*InputSz,段内仅一次Adds;直接在idxUb[nnzPos]子张量上 in-place 转偏移,避免每段 GM 重载。ALIGN_ELEM)时用标量GetValue手动 gather,支持任意稀疏度。SPVV_MIN_NNZ_PER_CORE(512) 个元素,减少启动核数、摊薄 per-core 开销。PlatformAscendCManager::GetCoreNumAiv()获取 AIV 核数(kernel 直调惯用法)。算子规格参数说明
ACL_SPARSE_OP_NON_TRANSPOSE)ACL_FLOAT)约束说明
ACL_SPARSE_OP_NON_TRANSPOSEACL_SPARSE_INDEX_32IACL_SPARSE_INDEX_BASE_ZERO[0, yLen-1](不校验,越界会导致 y 越界读、结果未定义/崩溃,由 caller 保证)ACL_FLOAT测试实现
spvv_test.cpp)compute_golden_fp32/compute_golden_fp16(double 累加,高精度参考值)aclsparseCreateSpVec+aclsparseCreateDnVecaclsparseSpvv,同步后回读结果CHECK_ACL/CHECK_ACL_SPARSE宏检测到错误时打印原因并return false,不继续执行。精度验证方法
|npu - golden| < 1e-3 * max(1, |golden|)|npu - golden| < 1e-2 * max(1, |golden|)(FP16 输入,FP32 乘积累加)double累加,消除参考值自身在大 nnz 下的累积误差编译运行
在 ops-sparse 仓库根目录下执行:
配置环境变量
source /usr/local/Ascend/ascend-toolkit/set_env.sh样例执行
执行结果如下,说明精度对比成功:
性能参考(ascend910b3, 48 核, FP32, nnz=100K)
接口说明
aclsparseSpvv
函数原型:
aclsparseStatus_t aclsparseSpvv( aclsparseHandle_t handle, aclsparseOperation_t op, aclsparseConstSpVecDescr_t x, aclsparseConstDnVecDescr_t y, void *result, aclDataType computeType);参数说明:
ACL_SPARSE_OP_NON_TRANSPOSE)ACL_FLOAT)返回值:
ACL_SPARSE_STATUS_SUCCESSACL_SPARSE_STATUS_HANDLE_IS_NULLPTRACL_SPARSE_STATUS_INVALID_VALUEACL_SPARSE_STATUS_NOT_SUPPORTEDaclsparseCreateSpVec / aclsparseCreateConstSpVec / aclsparseDestroySpVec
稀疏向量描述符的创建/销毁由
sparse/common/aclsparse_descr.cpp统一实现,详见include/cann_ops_sparse.h。