已关闭
[Requirement|需求建议]: 新增面向Ascend950的aclsparseCsr2cscEx2接口 #109
yuyuanfeng创建于 7月21日关闭于 7月25日
7月21日 关联了pull request:Feat: 新增 aclsparseCsr2cscEx2 算子
7月21日 修改了issue 的描述
7月21日 修改了issue 的描述
7月21日 修改了issue 的描述
7月21日 修改了issue 的描述
7月22日 修改标题为 “[Requirement|需求建议]: 新增面向Ascend950的aclsparseCsr2cscEx2接口”,原标题为“Feat: 新增面向Ascend950的aclsparseCsr2cscEx2接口”
7月22日 修改标题为 “[Requirement|需求建议]: 新增面向Ascend950的aclsparseCsr2cscEx2接口”,原标题为“Feat: 新增面向Ascend950的aclsparseCsr2cscEx2接口”
7月25日 关闭了 issue
7月25日 issue状态由 进行中 改变为 已完成
7月25日 添加了label:resolved
Background(背景信息)
aclsparseCsr2cscEx2实现稀疏矩阵的 CSR(Compressed Sparse Row)到 CSC(Compressed Sparse Column)格式转换,核心功能等价于稀疏矩阵转置(CSC = CSR^T)。接口为 Legacy API 中的 type-generic 接口(通过valType参数分发),支持多种数据类型。支持的稀疏格式:
csrVal、csrRowPtr、csrColInd三个数组定义cscVal、cscColPtr、cscRowInd三个数组定义支持的索引基址:
ACL_SPARSE_INDEX_BASE_ZERO(0-based)和ACL_SPARSE_INDEX_BASE_ONE(1-based)操作模式:
ACL_SPARSE_ACTION_SYMBOLIC:仅计算 CSC 结构(cscColPtr + cscRowInd),不拷贝值ACL_SPARSE_ACTION_NUMERIC:计算结构并拷贝值(cscVal)接口签名
aclsparseStatus_t aclsparseCsr2cscEx2_bufferSize( aclsparseHandle_t handle, int m, int n, int nnz, const void *csrVal, const int *csrRowPtr, const int *csrColInd, void *cscVal, int *cscColPtr, int *cscRowInd, aclDataType valType, aclsparseAction_t copyValues, aclsparseIndexBase_t idxBase, aclsparseCsr2CscAlg_t alg, size_t *bufferSize); aclsparseStatus_t aclsparseCsr2cscEx2( aclsparseHandle_t handle, int m, int n, int nnz, const void *csrVal, const int *csrRowPtr, const int *csrColInd, void *cscVal, int *cscColPtr, int *cscRowInd, aclDataType valType, aclsparseAction_t copyValues, aclsparseIndexBase_t idxBase, aclsparseCsr2CscAlg_t alg, void *buffer);参数约束
ACL_SPARSE_STATUS_HANDLE_IS_NULLPTRACL_SPARSE_STATUS_INVALID_VALUE特殊边界行为
aclrtSynchronizeStream同步精度标准
格式转换算子不涉及浮点运算(仅数据搬运和索引重排),精度标准为位精确。支持数据类型:INT8、FP16、BF16、FP32。
Origin(信息来源)
ops-sparse 算子库功能补齐,对齐 cuSPARSE cusparseCsr2cscEx2 接口能力。
Benefit / Necessity(价值/作用)
Design(设计方案)
四 Kernel 串行 SIMT 架构(DAV_3510 / arch35):
asc_atomic_add统计每列 nnz + stripe 列直方图Scatter 保序设计:列 j 的 CSC 段被划分为各 stripe 的不重叠子段,子段按 k 序排列,stripe 内单线程严格按 k 升序写入,输出与 CSR 行优先顺序逐位一致。
Tiling 策略:
numBlocks = min(CeilDiv(nnz, 256), aivCoreNum),核数经GetAivCoreCount()动态获取Workspace:
bufferSize = (2 + stripeCount) × (n + 1) × sizeof(int32_t)特殊场景处理:
平台约束:目标架构 arch35(Ascend950),Kernel 使用
asc_atomic_add原子操作。