---
title: aclnnFlashAttentionScore
description: "每个算子有两段接口，必须先调用“aclnnFlashAttentionScoreGetWorkspaceSize”接口获取入参并根据计算流程计算所需workspace大小，再调用“aclnnFlashAttentionScore”接口执行计算。两段式接口如下："
url: https://www.hiascend.com/document/detail/zh/Atlas200IDKA2DeveloperKit/latest/Application%20Development%20Guide/aadgc/aclcppdevg_03_0612.html
sourcePath: /source/zh/Atlas200IDKA2DeveloperKit/23.0.RC2/Application Development Guide/aadgc/aclcppdevg_03_0612.html
indexId: ab6a9a2b250a936dc018c28e571fdc22b9e9e523e3131a70afe70da829e89448105
---
# aclnnFlashAttentionScore

#### 接口原型

每个算子有两段接口，必须先调用“aclnnFlashAttentionScoreGetWorkspaceSize”接口获取入参并根据计算流程计算所需workspace大小，再调用“aclnnFlashAttentionScore”接口执行计算。两段式接口如下：

- 第一段接口：aclnnStatus aclnnFlashAttentionScoreGetWorkspaceSize(const aclTensor *query, const aclTensor *key, const aclTensor *value, const aclTensor *realShift, const aclTensor *dropMask, const aclTensor *paddingMask, const aclTensor *attenMask, double scaleValue, double keepProb, int64_t preTockens, int64_t nextTockens, int64_t headNum, string *inputLayout, int32_t innerPrecise, const aclTensor *softmaxMax, const aclTensor *softmaxSum, const aclTensor *softmaxOut, const aclTensor *attentionOut, uint64_t *workspaceSize, aclOpExecutor **executor)
- 第二段接口：aclnnStatus aclnnFlashAttentionScore(void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, aclrtStream stream)


#### 功能描述

- 算子功能：训练场景下，使用FlashAttention算法实现self-attention（自注意力）的计算。
- 计算公式：
  注意力的正向计算公式如下：


#### aclnnFlashAttentionScoreGetWorkspaceSize

- 接口定义：
  aclnnStatus aclnnFlashAttentionScoreGetWorkspaceSize(const aclTensor *query, const aclTensor *key, const aclTensor *value, const aclTensor *realShift, const aclTensor *dropMask, const aclTensor *paddingMask, const aclTensor *attenMask, double scaleValue, double keepProb, int64_t preTockens, int64_t nextTockens, int64_t headNum, string *inputLayout, int32_t innerPrecise, const aclTensor *softmaxMax, const aclTensor *softmaxSum, const aclTensor *softmaxOut, const aclTensor *attentionOut, uint64_t *workspaceSize, aclOpExecutor **executor)

- 参数说明：

  - query：Device侧的aclTensor，公式中输入Q，数据类型支持FLOAT、FLOAT16、BFLOAT16，数据格式支持ND。
  - key：Device侧的aclTensor，公式中输入K，数据类型支持FLOAT、FLOAT16、BFLOAT16，数据格式支持ND。
  - value：Device侧的aclTensor，公式中输入V，数据类型支持FLOAT、FLOAT16、BFLOAT16，数据格式支持ND。
  - realShift：Device侧的aclTensor，公式中输入pse，可选参数，表示位置编码。数据类型支持FLOAT、FLOAT16，数据格式支持ND。
  - dropMask：Device侧的aclTensor，可选属性，数据类型支持FLOAT、FLOAT16，数据格式支持ND。
  - paddingMask：Device侧的aclTensor，可选属性，数据类型支持FLOAT、FLOAT16，数据格式支持ND。
  - attenMask：Device侧的aclTensor，可选属性，代表下三角全为0上三角全为负无穷的倒三角mask矩阵，数据类型支持BOOL，数据格式支持ND。
  - scaleValue：Host侧的double，公式中d开根号的倒数，代表缩放系数，作为计算流中Muls的scalar值，数据类型支持DOUBLE。
  - keepProb：Host侧的double，可选参数，代表dropMask中1的比例，数据类型支持DOUBLE。
  - preTockens：Host侧的int64_t，用于稀疏计算的参数，可选参数，数据类型支持INT64。
  - nextTockens：Host侧的int64_t，用于稀疏计算的参数，可选参数，数据类型支持INT64。
  - headNum：Host侧的int64_t，代表head个数，数据类型支持INT64。
  - inputLayout：Host侧的string，代表输入query、key、value的数据排布格式，支持BSH、SBH、BSND、BNSD。
    query、key、value数据排布格式支持从多种维度解读，其中B（Batch）表示输入样本批量大小、S（Seq-Length）表示输入样本序列长度、H（Head-Size）表示隐藏层的大小、N（Head-Num）表示多头数、D（Head-Dim）表示隐藏层最小的单元尺寸，且满足D=H/N。

  - innerPrecise：Host侧的int32_t，数据类型支持INT32，内部计算精度模式，其中0表示为高精度，1表示为高性能。
  - softmaxMax：Device侧的aclTensor，正向计算的中间输出，数据类型支持FLOAT、FLOAT16，数据格式支持ND。
  - softmaxSum：Device侧的aclTensor，正向计算的中间输出，数据类型支持FLOAT、FLOAT16，数据格式支持ND。
  - softmaxOut：Device侧的aclTensor，正向计算的softmax输出，数据类型支持FLOAT、FLOAT16，数据格式支持ND。
  - attentionOut：Device侧的aclTensor，算子最终输出，数据类型支持FLOAT、FLOAT16、BFLOAT16，数据格式支持ND。
  - workspaceSize：返回用户需要在Device侧申请的workspace大小。
  - executor：返回op执行器，包含了算子计算流程。
- 返回值：
  返回aclnnStatus状态码，具体参见aclnn返回码。

  第一段接口完成入参校验，出现以下场景时报错： 返回161001（ACLNN_ERR_PARAM_NULLPTR）：传入的query、key、value、attention_out是空指针。 返回161002（ACLNN_ERR_PARAM_INVALID）：query、key、value、realShift、dropMask、paddingMask、attenMask、softmaxMax、softmaxSum、softmaxOut、attentionOut的数据类型和数据格式不在支持的范围内。


#### aclnnFlashAttentionScore

- 接口定义：
  aclnnStatus aclnnFlashAttentionScore(void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, aclrtStream stream)

- 参数说明：

  - workspace：在Device侧申请的workspace内存起址。
  - workspaceSize：在Device侧申请的workspace大小，由第一段接口aclnnFlashAttentionScoreGetWorkspaceSize获取。
  - executor：op执行器，包含了算子计算流程。
  - stream：指定执行任务的AscendCL stream流。
- 返回值：
  返回aclnnStatus状态码，具体参见aclnn返回码。


#### 约束与限制

关于数据shape的约束，以inputLayout的BSND、BNSD为例（BSH、SBH下H=N*D），其中

- B：取值范围为1~256。
- N：取值范围为1~256。
- S：取值范围为1~32K，且为16的倍数。
- D：取值为64、96、128、256。
