已关闭
[Requirement|需求建议]: 新增C风格接口支持uintdiv #1592
zhanghao_0689创建于 8月26日关闭于 9月23日
8月26日 添加了label:requirement
8月26日 将 zhanghao_0689 设为负责人
8月26日 移除了负责人 zhanghao_0689
8月27日 将 zhanghao_0689 设为负责人
9月3日 修改了issue 的描述
9月3日 修改了issue 的描述
9月3日 issue状态由 待办的 改变为 开发中
9月14日 将 zhangshunwei2 设为负责人
9月14日 移除了负责人 zhanghao_0689
9月14日 关联了pull request:feat: add asc_get_uintdiv scalar APIs
9月14日 关联了pull request:feat: add asc_uintdiv SIMT API
9月17日 修改了issue 的描述
zhangshunwei2
9月20日 评论:
9月20日 评论:
您好,需求目前在开发中,预计9.30前添加快除API


zhangshunwei2
9月22日 评论:
9月22日 评论:
快除接口已合入@李鑫
相关pr:https://gitcode.com/cann/asc-devkit/pull/6009


9月23日 issue状态由 开发中 改变为 已解决
9月23日 关闭了 issue
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.hT ∈ {uint32_t, uint64_t}q = umulhi(dividend, magic); return (dividend + q) >> shiftd,结果等于dividend / d(magic/shift由配套接口给出)2.2 C++ Scalar 配套接口
AscendC::GetUintDivMagicAndShift(T& magic, T& shift, T divisor)include/basic_api/kernel_operator_scalar_intf.hT ∈ {uint32_t, uint64_t}divisor生成magic、shift,供UintDiv使用divisor > 0;uint32侧要求divisor ≤ INT32_MAX;uint64侧要求divisor ≤ INT64_MAX(与现实现断言一致)2.3 典型调用流程
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模式;