aclnnAcosh

产品支持情况

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

功能说明

  • 接口功能:对输入张量 self 逐元素计算反双曲余弦值,结果写入输出张量 out。

  • 计算公式:

    outi=cosh⁡−1(selfi)=ln⁡(selfi+selfi2−1)out_i = \cosh^{-1}(self_i) = \ln\left(self_i + \sqrt{self_i^2 - 1}\right)

    其中 selfiself_i 表示输入张量第 i 个元素,outiout_i 表示对应输出元素。当 selfi<1self_i < 1 时,数学上无实数解,计算结果为 NaN,与 PyTorch torch.acosh 语义一致。

函数原型

每个算子分为两段式接口,必须先调用"aclnnAcoshGetWorkspaceSize"接口获取计算所需 workspace 大小以及包含了算子计算流程的执行器,再调用"aclnnAcosh"接口执行计算。

aclnnStatus aclnnAcoshGetWorkspaceSize(
  const aclTensor  *self,
  aclTensor        *out,
  uint64_t         *workspaceSize,
  aclOpExecutor    **executor)
aclnnStatus aclnnAcosh(
  void           *workspace,
  uint64_t        workspaceSize,
  aclOpExecutor  *executor,
  aclrtStream     stream)

aclnnAcoshGetWorkspaceSize

  • 参数说明

    参数名 输入/输出 描述 使用说明 数据类型 数据格式 维度(shape) 非连续Tensor
    self(aclTensor*) 输入 输入张量,对应公式中self,表示待计算反双曲余弦值的数据。
    • 支持空Tensor(元素数为0)。
    • 数据类型需与out保持一致。
    • shape需与out完全一致。
    • 输入值域建议为[1, +∞);小于1的值会产生NaN,框架层不做拦截。
    FLOAT16、FLOAT、BFLOAT16 ND 0-8
    out(aclTensor*) 输出 输出张量,对应公式中out,用于存放反双曲余弦计算结果。
    • 不支持空Tensor(self为空Tensor时除外)。
    • 数据类型需与self一致。
    • shape需与self完全一致。
    FLOAT16、FLOAT、BFLOAT16 ND 0-8
    workspaceSize(uint64_t*) 输出 返回需要在Device侧申请的workspace大小。 - - - - -
    executor(aclOpExecutor**) 输出 返回op执行器,包含了算子计算流程。 - - - - -
  • 返回值

    aclnnStatus:返回状态码,具体参见aclnn返回码

    第一段接口完成入参校验,出现以下场景时报错:

    返回值 错误码 描述
    ACLNN_ERR_PARAM_NULLPTR 161001 self或out存在空指针。
    ACLNN_ERR_PARAM_INVALID 161002 self或out的数据类型不在支持的范围之内(仅支持FLOAT16、FLOAT、BFLOAT16)。
    self与out的数据类型不一致。
    self或out的shape维度不在支持的范围之内(仅支持0-8维),或self与out的shape不一致。

aclnnAcosh

  • 参数说明

    参数名输入/输出描述
    workspace输入在Device侧申请的workspace内存地址。
    workspaceSize输入在Device侧申请的workspace大小,由第一段接口aclnnAcoshGetWorkspaceSize获取。
    executor输入op执行器,包含了算子计算流程。
    stream输入指定执行任务的Stream。
  • 返回值

    aclnnStatus:返回状态码,具体参见aclnn返回码

约束说明

  • aclnnAcosh默认确定性实现。
  • Atlas A2 训练系列产品/Atlas A2 推理系列产品:仅支持FLOAT16、FLOAT、BFLOAT16数据类型,不支持其他数据类型。
  • 输入值域约束:acosh数学定义域为[1, +∞),输入元素小于1时结果为NaN,接口层不做拦截,由调用方保证输入合法性。
  • 逐元素算子,不涉及广播,输入输出shape须完全一致。

调用示例

示例代码如下,仅供参考,具体编译和执行过程请参考编译与运行样例

完整示例代码见 examples/example_aclnn_acosh.cpp,以下为核心调用流程:

#include "acl/acl.h"
#include "aclnn_acosh.h"

// 1. ACL 初始化
aclInit(nullptr);
aclrtSetDevice(0);
aclrtStream stream = nullptr;
aclrtCreateStream(&stream);

// 2. 准备输入数据(以 float32 为例,计算 acosh([1.0, 2.0, 5.0, 10.0]))
std::vector<float> inputData = {1.0f, 2.0f, 5.0f, 10.0f};
std::vector<int64_t> shape = {4};
size_t dataSize = inputData.size() * sizeof(float);

// 3. 分配 NPU 内存并拷贝输入数据
void* inputDev = nullptr;
void* outputDev = nullptr;
aclrtMalloc(&inputDev, dataSize, ACL_MEM_MALLOC_HUGE_FIRST);
aclrtMalloc(&outputDev, dataSize, ACL_MEM_MALLOC_HUGE_FIRST);
aclrtMemcpy(inputDev, dataSize, inputData.data(), dataSize, ACL_MEMCPY_HOST_TO_DEVICE);

// 4. 创建 aclTensor(连续 ND 格式)
std::vector<int64_t> strides = {1};   // shape={4} 时 stride={1}
aclTensor* selfTensor = aclCreateTensor(shape.data(), shape.size(), ACL_FLOAT,
    strides.data(), 0, ACL_FORMAT_ND, shape.data(), shape.size(), inputDev);
aclTensor* outTensor = aclCreateTensor(shape.data(), shape.size(), ACL_FLOAT,
    strides.data(), 0, ACL_FORMAT_ND, shape.data(), shape.size(), outputDev);

// 5. 第一段接口:获取 workspace 大小和 executor
uint64_t workspaceSize = 0;
aclOpExecutor* executor = nullptr;
aclnnAcoshGetWorkspaceSize(selfTensor, outTensor, &workspaceSize, &executor);

// 6. 分配 workspace(大小为 0 时跳过)
void* workspace = nullptr;
if (workspaceSize > 0) {
    aclrtMalloc(&workspace, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST);
}

// 7. 第二段接口:执行算子
aclnnAcosh(workspace, workspaceSize, executor, stream);
aclrtSynchronizeStream(stream);

// 8. 拷回结果
std::vector<float> output(inputData.size());
aclrtMemcpy(output.data(), dataSize, outputDev, dataSize, ACL_MEMCPY_DEVICE_TO_HOST);
// output = [0.0, 1.3169578, 2.2924316, 2.9932227]

// 9. 清理资源
if (workspace) aclrtFree(workspace);
aclDestroyTensor(selfTensor);
aclDestroyTensor(outTensor);
aclrtFree(inputDev);
aclrtFree(outputDev);
aclrtDestroyStream(stream);
aclrtResetDevice(0);
aclFinalize();