Sgetrf

产品支持情况

产品 是否支持
Atlas 200I/500 A2 推理产品 ×
Atlas 推理系列产品 ×
Atlas 训练系列产品 ×
Atlas A3 训练系列产品/Atlas A3 推理系列产品
Atlas A2 训练系列产品/Atlas A2 推理系列产品
Ascend 950PR/Ascend 950DT ×

功能说明

  • 接口功能
    aclsolverSgetrf:对实数矩阵进行LU分解。

  • 计算公式

    A=P⋅L⋅UA = P \cdot L \cdot U

    其中AAm×nm \times n阶实数矩阵,PP为置换矩阵,LL为单位下三角矩阵,UU为上三角矩阵。

  • 示例
    输入"A"为:

    [4.0, 3.0, 2.0, 1.0
     3.0, 4.0, 3.0, 2.0
     2.0, 3.0, 4.0, 3.0
     1.0, 2.0, 3.0, 4.0]
    

    输入"m"为: 4
    输入"n"为: 4
    调用"aclsolverSgetrf"算子后,
    输出"A"为L和U合并存储:

    [4.0, 3.0, 2.0, 1.0
     0.75, 1.75, 1.5, 1.25
     0.5, 0.4286, 2.0, 2.0
     0.25, 0.2857, 0.5, 2.0]
    

    输出"ipiv"为pivot信息:

    [1, 2, 3, 4]
    

函数原型

  • 函数定义

    aclError aclsolverSgetrf(
        aclsolverHandle_t handle,
        const int64_t m,
        const int64_t n,
        float *A,
        const int64_t lda,
        int32_t *ipiv,
        int32_t *info);
    
  • 参数说明:

    参数名 输入输出 描述
    handle 输入 solver handle,通过aclsolverCreate创建
    m 输入 矩阵A的行数
    n 输入 矩阵A的列数
    A 输入/输出 输入为矩阵A,输出为L和U矩阵
    数据类型仅支持FLOAT32,数据格式支持ND,shape为[m, n]
    lda 输入 A同一列中相邻两行元素间的内存地址偏移量(leading dimension)(当前约束为n)
    ipiv 输出 置换矩阵的pivot信息
    数据类型支持int32_t,数据格式支持ND,shape为[min(m,n), 1]
    info 输出 分解结果信息
    数据类型支持int32_t
  • 算子约束:

    • lda、info参数在当前版本实际未启用。
  • 调用实现 使用内核调用符<<<>>>调用核函数。

调用示例

  • 完整代码示例:aclsolverSgetrf矩阵LU分解示例

  • 核心调用步骤:

    #include <vector>
    #include "acl/acl.h"
    #include "cann_ops_solver.h"
    
    int32_t main(int32_t argc, char *argv[])
    {
        // 固定写法,acl初始化
        int32_t deviceId = 0;
        aclrtStream stream = nullptr;
        aclInit(nullptr);
        aclrtSetDevice(deviceId);
        aclrtCreateStream(&stream);
    
        // 创建solver handle并设置stream
        aclsolverHandle_t handle = nullptr;
        aclsolverCreate(&handle);
        aclsolverSetStream(handle, stream);
    
        // 构造输入数据
        int64_t m = 4;
        int64_t n = 4;
        size_t aMatrixFileSize = m * n * sizeof(float);
        float* A;
        aclrtMallocHost((void**)(&A), aMatrixFileSize);
        // 填充A矩阵数据...
    
        int32_t *ipiv = new int32_t[std::min(m, n)];
        int32_t *info;
    
        // 调用 aclsolverSgetrf
        auto ret = aclsolverSgetrf(handle, m, n, A, n, ipiv, info);
        CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclsolverSgetrf failed. ERROR: %d\n", ret); return ret);
    
        // 释放资源
        delete[] ipiv;
        aclrtFreeHost(A);
        aclsolverDestroy(handle);
        aclrtDestroyStream(stream);
        aclrtResetDevice(deviceId);
        aclFinalize();
    
        return 0;
    }