aclblasAxpyEx 实现 BLAS Level-1 AXPY 操作 y := alpha*x + y 的扩展版本,支持多 dtype 数据类型,是线性代数与科学计算中最基础的向量运算之一。
aclblasAxpyEx
y := alpha*x + y
y[j] = alpha * x[i] + y[j] for k = 0, 1, ..., n-1 其中: i = ix_0 + k * incx j = iy_0 + k * incy ix_0 = (incx >= 0) ? 0 : (1 - n) * incx iy_0 = (incy >= 0) ? 0 : (1 - n) * incy
incx
incy
alpha
xType != ACL_FLOAT
yType != ACL_FLOAT
alpha * x + y
yType
aclblasStatus_t aclblasAxpyEx( aclblasHandle_t handle, int n, const void* alpha, aclDataType alphaType, const void* x, aclDataType xType, int incx, void* y, aclDataType yType, int incy, aclDataType executionType);
ACL_FLOAT
ACL_FLOAT16
ACL_BF16
约束:初始版本要求 xType == yType,若 xType != yType 返回 ACLBLAS_STATUS_NOT_SUPPORTED。
xType == yType
xType != yType
ACLBLAS_STATUS_NOT_SUPPORTED
handle == nullptr
ACLBLAS_STATUS_HANDLE_IS_NULLPTR
n < 0
ACLBLAS_STATUS_INVALID_VALUE
n == 0
ACLBLAS_STATUS_SUCCESS
n > 0 && alpha/x/y == nullptr
incx == 0
incy == 0
alphaType != ACL_FLOAT
executionType != ACL_FLOAT
xType/yType ∉ {ACL_FLOAT16, ACL_BF16, ACL_FLOAT}
采用 MERE_MARE(最大相对误差 + 最大绝对相对误差)模式:
不需要额外 workspace。所有中间计算在 UB(Unified Buffer)中完成。
cann 开发者
AXPY(y = alpha*x + y)是 BLAS Level-1 标准向量运算,广泛应用于线性代数、科学计算、迭代求解器(如共轭梯度法)、神经网络训练中的梯度更新等场景。
y = alpha*x + y
aclblasAxpyEx 作为 AXPY 的扩展版本,提供以下价值:
aclrtPointerGetAttributes
采用 SIMD(连续路径)+ SIMT(跨步路径)双路径架构:
incx==1 && incy==1
DataCopy
DataCopyPad
Axpy
Cast
incx!=1
incy!=1
__simt_vf__
asc_vf_call
perCoreN
startOffsetX
startOffsetY
static_cast<float>
<<<>>>
aclrtSynchronizeStream
Axpy()
Background(背景信息)
aclblasAxpyEx实现 BLAS Level-1 AXPY 操作y := alpha*x + y的扩展版本,支持多 dtype 数据类型,是线性代数与科学计算中最基础的向量运算之一。数学定义
incx/incy为元素间隔(非字节),支持负值反向遍历(BLAS 标准语义)。alpha为标量乘数(FP32),可在 Host 或 Device 内存。xType != ACL_FLOAT或yType != ACL_FLOAT时,计算过程先将元素 Cast 到 FP32,完成alpha * x + y运算后,再将结果 Cast 回yType写回。接口签名
aclblasStatus_t aclblasAxpyEx( aclblasHandle_t handle, int n, const void* alpha, aclDataType alphaType, const void* x, aclDataType xType, int incx, void* y, aclDataType yType, int incy, aclDataType executionType);支持数据类型
ACL_FLOAT(固定)ACL_FLOAT16、ACL_BF16、ACL_FLOATACL_FLOAT16、ACL_BF16、ACL_FLOATACL_FLOAT(固定)约束:初始版本要求
xType == yType,若xType != yType返回ACLBLAS_STATUS_NOT_SUPPORTED。参数约束
handle == nullptrACLBLAS_STATUS_HANDLE_IS_NULLPTRn < 0ACLBLAS_STATUS_INVALID_VALUEn == 0ACLBLAS_STATUS_SUCCESS(no-op)n > 0 && alpha/x/y == nullptrACLBLAS_STATUS_INVALID_VALUEincx == 0或incy == 0ACLBLAS_STATUS_INVALID_VALUEalphaType != ACL_FLOATACLBLAS_STATUS_NOT_SUPPORTEDexecutionType != ACL_FLOATACLBLAS_STATUS_NOT_SUPPORTEDxType/yType ∉ {ACL_FLOAT16, ACL_BF16, ACL_FLOAT}ACLBLAS_STATUS_NOT_SUPPORTEDxType != yTypeACLBLAS_STATUS_NOT_SUPPORTED精度标准
采用 MERE_MARE(最大相对误差 + 最大绝对相对误差)模式:
目标芯片与架构
Workspace 需求
不需要额外 workspace。所有中间计算在 UB(Unified Buffer)中完成。
Origin(信息来源)
cann 开发者
Benefit / Necessity (价值/作用)
AXPY(
y = alpha*x + y)是 BLAS Level-1 标准向量运算,广泛应用于线性代数、科学计算、迭代求解器(如共轭梯度法)、神经网络训练中的梯度更新等场景。aclblasAxpyEx作为 AXPY 的扩展版本,提供以下价值:incx/incy正负步长,覆盖连续访问与跨步访问两种内存布局,兼容标准 BLAS 调用模式。aclrtPointerGetAttributes动态判断,适配不同调用场景。Design(设计方案)
编程模型
采用 SIMD(连续路径)+ SIMT(跨步路径)双路径架构:
incx==1 && incy==1):SIMD 编程模型,使用DataCopy/DataCopyPad搬运 x/y 向量到 UB,Axpy/Cast向量 API 计算,多核均分元素。FP16/BF16 使用 SIMD VF RegBase 在寄存器内完成 UNPACK→Cast→Muls+Add→Cast→PACK,中间值不落 UB。incx!=1或incy!=1):SIMT 编程模型,__simt_vf__修饰计算函数,asc_vf_call启动线程级并行,直接 GM 读写,块级连续+线程级交错混合分布。Tiling 策略
perCoreN均分,尾核处理 remainder;跨步路径 nthreads 向下对齐,消除空闲核。incx/incy保留符号支持负步长,startOffsetX/startOffsetY在 Host 侧预计算。Kernel 设计
static_cast<float>中转。Host 设计
aclrtPointerGetAttributes动态判断 Host/Device,通过 TilingData.alphaIsDevice 标志传递。<<<>>>异步启动 Kernel,launch 后直接返回,不调用aclrtSynchronizeStream。参考算子
Axpy()API 用法、SIMT 跨步模式、双向量 UB Buffer 规划。