已关闭
[Requirement|需求建议]: 新增C风格接口支持uintdiv #1592
zhanghao_0689创建于  8月26日关闭于  9月23日
zhanghao_0689
zhanghao_0689成员
8月26日 创建

Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.

Background(背景信息)

新增C风格接口支持uintdiv,避免出现代码风格混乱

Origin(信息来源)

NA

Benefit / Necessity (价值/作用)

Design(设计方案)

1. 背景

AscendC Simt演进过程中存在一套cpp接口,提供了整数快速除法的能力UintDiv,但是当前simt的c api无此能力,用户如果想使用此接口时,会出现C&C++代码风格混杂,代码可读性可维护性均差。
用户反馈见issue:https://gitcode.com/cann/asc-devkit/issues/1322

2. 现状(原有用法)

2.1 C++ SIMT 计算接口

项 内容
声明 AscendC::Simt::UintDiv(T dividend, T magic, T shift)
头文件 include/simt_api/cpp/kernel_simt_math_intf.h
类型 T ∈ {uint32_t, uint64_t}
语义 q = umulhi(dividend, magic); return (dividend + q) >> shift
语义等价 对固定除数 d,结果等于 dividend / d(magic/shift 由配套接口给出)

2.2 C++ Scalar 配套接口

项 内容
声明 AscendC::GetUintDivMagicAndShift(T& magic, T& shift, T divisor)
头文件 include/basic_api/kernel_operator_scalar_intf.h
类型 T ∈ {uint32_t, uint64_t}
作用 由 divisor 生成 magic、shift,供 UintDiv 使用
约束 divisor > 0;uint32 侧要求 divisor ≤ INT32_MAX;uint64 侧要求 divisor ≤ INT64_MAX(与现实现断言一致)

2.3 典型调用流程

1. 标量/Host(或可提前计算处):
     GetUintDivMagicAndShift(magic, shift, d);

2. SIMT Kernel 热路径:
     q = UintDiv(n, magic, shift);   // ≈ n / d

3. 修改方案

只支持SIMD+SIMT新同构编程方式,SIMT编程无法使用此接口,新增如下接口:

// simt接口
uint32_t  asc_uintdiv(uint32_t dividend, uint32_t magic, uint32_t shift);
uint64_t asc_uintdiv(uint64_t dividend, uint64_t magic, uint64_t shift);

// scalar接口
void asc_get_uintdiv_magic_and_shift(uint32_t* magic, uint32_t* shift, uint32_t divisor);
void asc_get_uintdiv_magic_and_shift(uint64_t* magic, uint64_t* shift, uint64_t divisor);

添加Ascend 扩展前缀,强调非标准数学库接口


4. 用法对照

4.1 原有代码

using namespace AscendC;
using namespace AscendC::Simt;

uint32_t magic = 0, shift = 0;
GetUintDivMagicAndShift(magic, shift, d);
uint32_t q = UintDiv(n, magic, shift);

4.2 修改后(C风格)

unsigned int magic = 0, shift = 0;
asc_get_uintdiv_magic_and_shift(&magic, &shift, d);
unsigned int q = asc_uintdiv(n, magic, shift);

uint64 同理,类型换为 unsigned long long。

当前只支持A5,并且在资料中说明配套SIMT接口完成整数快速除法;
SIMT接口:include/simt_api/math_functions.h,只支持simd+simt新同构方式使用,不支持simt模式;
SIMD接口:include/simt_api/math_functions.h,只支持simd+simt新同构方式使用,不支持simt模式;

likedislike
zhanghao_0689zhanghao_0689成员
8月26日 添加了label:requirement
zhanghao_0689zhanghao_0689成员
8月26日 将 zhanghao_0689 设为负责人
zhanghao_0689zhanghao_0689成员
8月26日 移除了负责人 zhanghao_0689
zhanghao_0689zhanghao_0689成员
8月27日 将 zhanghao_0689 设为负责人
zhanghao_0689zhanghao_0689成员
9月3日 修改了issue 的描述
zhanghao_0689zhanghao_0689成员
9月3日 修改了issue 的描述
zhanghao_0689zhanghao_0689成员
9月3日 issue状态由 待办的 改变为 开发中
zhanghao_0689zhanghao_0689成员
9月14日 将 zhangshunwei2 设为负责人
zhanghao_0689zhanghao_0689成员
9月14日 移除了负责人 zhanghao_0689
Zzhangshunwei2成员
9月14日 关联了pull request:feat: add asc_get_uintdiv scalar APIs
Zzhangshunwei2成员
9月14日 关联了pull request:feat: add asc_uintdiv SIMT API
zhanghao_0689zhanghao_0689成员
9月17日 修改了issue 的描述
zhangshunwei2成员
9月20日 评论:

您好,需求目前在开发中,预计9.30前添加快除API

likedislike
zhangshunwei2成员
9月22日 评论:

快除接口已合入@李鑫
相关pr:https://gitcode.com/cann/asc-devkit/pull/6009

likedislike
Zzhangshunwei2成员
9月23日 issue状态由 开发中 改变为 已解决
Zzhangshunwei2成员
9月23日 关闭了 issue