# aclCompileOpt

```
typedef enum {
ACL_PRECISION_MODE,           // 算子精度模式
ACL_AICORE_NUM,               // 模型编译时使用的AI Core数量
ACL_AUTO_TUNE_MODE,           // 算子的自动调优模式
ACL_OP_SELECT_IMPL_MODE,      // 选择算子是高精度实现还是高性能实现
ACL_OPTYPELIST_FOR_IMPLMODE,  // 列举算子类型的列表，该列表中的算子使用ACL_OP_SELECT_IMPL_MODE指定的模式
ACL_OP_DEBUG_LEVEL,           // TBE算子编译debug功能开关
ACL_DEBUG_DIR,                // 保存模型转换、网络迁移过程中算子编译生成的调试相关过程文件的路径，包括算子.o/.json/.cce等文件。
ACL_OP_COMPILER_CACHE_MODE,   // 算子编译磁盘缓存模式
ACL_OP_COMPILER_CACHE_DIR,    // 算子编译磁盘缓存的目录
ACL_OP_PERFORMANCE_MODE,      // 通过该选项设置是否按照算子执行高性能的方式编译算子
ACL_OP_JIT_COMPILE,           // 选择是在线编译算子，还是使用已编译的算子二进制文件
ACL_OP_DETERMINISTIC,         // 是否开启确定性计算
ACL_CUSTOMIZE_DTYPES,         // 模型编译时自定义某个或某些算子的计算精度
ACL_OP_PRECISION_MODE,        // 指定算子内部处理时的精度模式，支持指定一个算子或多个算子。
ACL_ALLOW_HF32                // hf32是昇腾推出的专门用于算子内部计算的精度类型，当前版本不支持
} aclCompileOpt;
```


**表1 编译选项配置**

| 编译选项 | 取值说明 |
| --- | --- |
| ACL\_PRECISION\_MODE | 用于配置算子精度模式。如果不配置该编译选项，默认采用allow\_fp32\_to\_fp16。 force\_fp32/cube\_fp16in\_fp32out： 配置为force\_fp32或cube\_fp16in\_fp32out，效果等同，系统内部都会根据矩阵类算子或矢量类算子，来选择不同的处理方式。cube\_fp16in\_fp32out为新版本中新增的，对于矩阵计算类算子，该选项语义更清晰。 对于矩阵计算类算子，系统内部会按算子实现的支持情况处理： 优先选择输入数据类型为float16且输出数据类型为float32； 如果1中的场景不支持，则选择输入数据类型为float32且输出数据类型为float32； 如果2中的场景不支持，则选择输入数据类型为float16且输出数据类型为float16； 如果3中的场景不支持，则报错。 对于矢量计算类算子，表示网络模型中算子支持float16和float32时，强制选择float32，若原图精度为float16，也会强制转为float32。 如果网络模型中存在部分算子，并且该算子实现不支持float32，比如某算子仅支持float16类型，则该参数不生效，仍然使用支持的float16；如果该算子不支持float32，且又配置了黑名单（precision\_reduce = false），则会使用float32的AI CPU算子；如果AI CPU算子也不支持，则执行报错。 force\_fp16： 表示网络模型中算子支持float16和float32时，强制选择float16。 allow\_fp32\_to\_fp16： 对于矩阵类算子，使用float16。 对于矢量类算子，优先保持原图精度，如果网络模型中算子支持float32，则保留原始精度float32，如果网络模型中算子不支持float32，则直接降低精度到float16。 must\_keep\_origin\_dtype： 表示保持原图精度。 如果原图中某算子精度为float16，AI Core中该算子的实现不支持float16、仅支持float32，则系统内部会自动采用高精度float32。 如果原图中某算子精度为float32，AI Core中该算子的实现不支持float32类型、仅支持float16类型，则会使用float32的AI CPU算子；如果AI CPU算子也不支持，则执行报错。 allow\_mix\_precision/allow\_mix\_precision\_fp16： 配置为allow\_mix\_precision或allow\_mix\_precision\_fp16，效果等同，均表示使用混合精度float16和float32数据类型来处理神经网络的过程。allow\_mix\_precision\_fp16为新版本中新增的，语义更清晰，便于理解。 针对网络模型中float32数据类型的算子，按照内置的优化策略，自动将部分float32的算子降低精度到float16，从而在精度损失很小的情况下提升系统性能并减少内存使用。 若配置了该种模式，则可以在OPP软件包安装路径${INSTALL\_DIR}/opp/built\-in/op\_impl/ai\_core/tbe/config/<soc\_version>/aic\-<soc\_version>\-ops\-info.json内置优化策略文件中查看“precision\_reduce”参数的取值： 若取值为true（白名单），则表示允许将当前float32类型的算子，降低精度到float16。 若取值为false（黑名单），则不允许将当前float32类型的算子降低精度到float16，相应算子仍旧使用float32精度。 若网络模型中算子没有配置该参数（灰名单），当前算子的混合精度处理机制和前一个算子保持一致，即如果前一个算子支持降精度处理，当前算子也支持降精度；如果前一个算子不允许降精度，当前算子也不支持降精度。 |
| ACL\_AICORE\_NUM | 用于配置模型编译时使用的AI Core数量。 当前版本设置无效。 |
| ACL\_AUTO\_TUNE\_MODE | 该参数后续废弃，请勿配置，否则后续版本可能存在兼容性问题。若涉及调优，请参见《AOE工具使用指南(https://www.hiascend.com/document/detail/zh/canncommercial/700/devtools/auxiliarydevtool/auxiliarydevtool\_0005.html)》。 用于配置算子的自动调优模式。 不支持该参数。 |
| ACL\_OP\_SELECT\_IMPL\_MODE | 用于选择算子是高精度实现还是高性能实现。如果不配置该编译选项，默认采用high\_precision。 high\_precision：表示算子采用高精度实现模式。 该参数采用系统内置的配置文件设置算子实现模式，内置配置文件路径为${INSTALL\_DIR}/opp/built\-in/op\_impl/ai\_core/tbe/impl\_mode/high\_precision.ini。 为保持兼容，该参数仅对high\_precision.ini文件中算子列表生效，通过该列表可以控制算子生效的范围并保证之前版本的网络模型不受影响。 high\_performance：表示算子采用高性能实现模式。 该参数采用系统内置的配置文件设置算子实现模式，内置配置文件路径为${INSTALL\_DIR}/opp/built\-in/op\_impl/ai\_core/tbe/impl\_mode/high\_performance.ini。 为保持兼容，该参数仅对high\_performance.ini文件中算子列表生效，通过该列表可以控制算子生效的范围并保证之前版本的网络模型不受影响。 high\_precision\_for\_all：表示算子采用高精度实现模式。 该参数采用系统内置的配置文件设置算子实现模式，内置配置文件路径为${INSTALL\_DIR}/opp/built\-in/op\_impl/ai\_core/tbe/impl\_mode/high\_precision\_for\_all.ini，该文件中列表后续可能会跟随版本更新。 该实现模式不保证兼容，如果后续新的软件包中有算子新增了实现模式（即配置文件中新增了某个算子的实现模式），之前版本使用high\_precision\_for\_all的网络模型，在新版本上性能可能会下降。 high\_performance\_for\_all：表示算子采用高性能实现模式。 该参数采用系统内置的配置文件设置算子实现模式，内置配置文件路径为${INSTALL\_DIR}/opp/built\-in/op\_impl/ai\_core/tbe/impl\_mode/high\_performance\_for\_all.ini，该文件中列表后续可能会跟随版本更新。 该实现模式不保证兼容，如果后续新的软件包中有算子新增了实现模式（即配置文件中新增了某个算子的实现模式），之前版本使用high\_performance\_for\_all的网络模型，在新版本上精度可能会下降。 |
| ACL\_OPTYPELIST\_FOR\_IMPLMODE | 通过ACL\_OPTYPELIST\_FOR\_IMPLMODE选项设置算子类型的列表（多个算子使用英文逗号进行分隔），与ACL\_OP\_SELECT\_IMPL\_MODE选项配合使用，设置列表中的算子通过高精度实现或高性能实现。 |
| ACL\_OP\_DEBUG\_LEVEL | 用于配置TBE算子编译debug功能开关。 0：不开启算子debug功能，在执行atc命令当前路径不生成算子编译目录kernel\_meta。 1：开启算子debug功能，在执行atc命令的目录下，生成kernel\_meta文件夹，并在该文件夹下生成.o（算子二进制文件）、.json文件（算子描述文件）以及TBE指令映射文件（算子cce文件\*.cce和python\-cce映射文件\*\_loc.json），用于后续分析AICore Error问题。 2：开启算子debug功能，在执行atc命令的目录下，生成kernel\_meta文件夹，并在该文件夹下生成.o（算子二进制文件）、.json文件（算子描述文件）以及TBE指令映射文件（算子cce文件\*.cce和python\-cce映射文件\*\_loc.json），用于后续分析AICore Error问题，同时设置为2，还会关闭编译优化开关、开启ccec调试功能（ccec编译器选项设置为\-O0\-g）。 3：不开启算子debug功能，在执行atc命令的目录下，生成kernel\_meta文件夹，并在该文件夹中生成.o（算子二进制文件）和.json文件（算子描述文件），分析算子问题时可参考。 4：不开启算子debug功能，在执行atc命令的目录下，生成kernel\_meta文件夹，并在该文件夹下生成.o（算子二进制文件）和.json文件（算子描述文件）以及TBE指令映射文件（算子cce文件\*.cce）和UB融合计算描述文件（{$kernel\_name}\_compute.json），可在分析算子问题时进行问题复现、精度比对时使用。 说明： 配置为2（即开启ccec编译选项）时，会导致算子Kernel（\*.o文件）大小增大。动态Shape场景下，由于算子编译时会遍历可能的Shape场景，因此可能会导致算子Kernel文件过大而无法进行编译，此种场景下，建议不要配置ccec编译选项。 由于算子Kernel文件过大而无法编译的报错日志示例如下： message:link error ld.lld: error: InputSection too large for range extension thunk ./kernel\_meta\_xxxxx.o |
| ACL\_DEBUG\_DIR | 用于配置保存模型转换、网络迁移过程中算子编译生成的调试相关过程文件的路径（默认路径：执行应用的当前路径/kernel\_meta），包括算子.o/.json/.cce等文件。具体生成哪些文件以ACL\_OP\_DEBUG\_LEVEL选项设置的取值为准。 路径支持大小写字母（a\-z，A\-Z）、数字（0\-9）、下划线（\_）、中划线（\-）、句点（.）、中文字符。 说明： 关于配置算子编译文件的缓存目录，除此处设置枚举值的方式，还可以配置环境变量ASCEND\_WORK\_PATH，几种方式的优先级为：本节设置枚举值的方式 > 设置环境变量 > 默认路径。 环境变量的详细配置说明请参见《环境变量参考(https://www.hiascend.com/document/detail/zh/canncommercial/700/reference/envvar/envref\_07\_0001.html)》）。 |
| ACL\_OP\_COMPILER\_CACHE\_MODE | 用于配置算子编译磁盘缓存模式。该编译选项需要与ACL\_OP\_COMPILER\_CACHE\_DIR配合使用。 enable：表示启用算子编译缓存。启用后可以避免针对相同编译参数及算子参数的算子重复编译，从而提升编译速度。 force：启用算子编译缓存功能，区别于enable模式，force模式下会强制刷新缓存，即先删除已有缓存，再重新编译并加入缓存。比如当用户的python变更、依赖库变更、算子调优后知识库变更等，需要先指定为force用于先清理已有的缓存，后续再修改为enable模式，以避免每次编译时都强制刷新缓存。 disable：表示禁用算子编译缓存。 该场景下，可以通过环境变量ASCEND\_MAX\_OP\_CACHE\_SIZE来限制某个芯片下缓存文件夹的磁盘空间的大小，当编译缓存空间大小达到ASCEND\_MAX\_OP\_CACHE\_SIZE设置的取值，且需要删除旧的kernel文件时，可以通过环境变量ASCEND\_REMAIN\_CACHE\_SIZE\_RATIO设置需要保留缓存的空间大小比例。配置示例如下： |
| ACL\_OP\_COMPILER\_CACHE\_DIR | 用于配置算子编译文件的缓存目录（默认路径：$HOME/atc\_data）。该编译选项需要与ACL\_OP\_COMPILER\_CACHE\_MODE配合使用。 路径支持大小写字母（a\-z，A\-Z）、数字（0\-9）、下划线（\_）、中划线（\-）、句点（.）、中文字符。 如果设置了ACL\_OP\_DEBUG\_LEVEL编译选项，则只有编译选项值为0或3才会启用编译缓存功能，其它取值禁用编译缓存功能。 说明： 关于配置算子编译文件的缓存目录，除此处设置枚举值的方式，还可以配置环境变量ASCEND\_CACHE\_PATH，几种方式的优先级为：本节设置枚举值的方式 > 设置环境变量 > 默认路径。 环境变量的详细配置说明请参见《环境变量参考(https://www.hiascend.com/document/detail/zh/canncommercial/700/reference/envvar/envref\_07\_0001.html)》）。 |
| ACL\_OP\_PERFORMANCE\_MODE | 该参数已废弃，请勿配置，否则后续版本可能存在兼容性问题。 通过该选项设置是否按照算子执行高性能的方式编译算子，默认采用normal方式。 取值范围： normal：算子编译时按照编译性能最高的方式进行编译。 high：算子编译时应该按照算子执行性能最好的方式去泛化编译。 |
| ACL\_OP\_JIT\_COMPIL | 选择是在线编译算子，还是使用已编译的算子二进制文件。 enable：在线编译算子，系统根据得到的算子信息进行优化，从而编译出运行性能更优的算子。固定Shape网络场景下，建议设置为enable。 disable：优先查找系统中的已编译好的算子二进制文件，如果能查找到，则不再编译算子，编译性能更优；如果查找不到，则再编译算子。动态Shape网络场景下，建议设置为disable。若将本参数设置为disable，则需要安装算子二进制文件包，请参见《CANN 软件安装指南(https://www.hiascend.com/document/detail/zh/canncommercial/700/envdeployment/instg/instg\_0001.html)》中的“安装二进制算子包”章节。 Atlas 200/500 A2推理产品，该选项默认值为enable。 |
| ACL\_OP\_DETERMINISTIC | 是否开启确定性计算。 0：默认值，不开启确定性计算。 1：开启确定性计算。 当开启确定性计算功能时，算子在相同的硬件和输入下，多次执行将产生相同的输出。但启用确定性计算往往导致算子执行变慢。 默认情况下，不开启确定性计算，算子在相同的硬件和输入下，多次执行的结果可能不同。这个差异的来源，一般是因为在算子实现中，存在异步的多线程执行，会导致浮点数累加的顺序变化。 通常建议不开启确定性计算，因为确定性计算往往会导致算子执行变慢，进而影响性能。当发现模型多次执行结果不同，或者是进行精度调优时，可开启确定性计算，辅助模型调试、调优。 |
| ACL\_CUSTOMIZE\_DTYPES | \*.cfg配置文件路径，包含文件名，配置文件中列举需要指定计算精度的算子名称或算子类型，每个算子单独一行。通过该配置，在模型编译时，可自定义某个或某些算子的计算精度。 配置约束： 路径和文件名支持大小写字母（a\-z，A\-Z）、数字（0\-9）、下划线（\_）、中划线（\-）、句点（.）、英文冒号(:)、中文字符。 配置文件中若为算子名称，以Opname::InputDtype:dtype1,...,OutputDtype:dtype1,...格式进行配置，每个Opname单独一行，dtype1，dtype2..需要与可设置计算精度的算子输入，算子输出的个数一一对应。 配置文件中若为算子类型，以OpType::TypeName:InputDtype:dtype1,...,OutputDtype:dtype1,...格式进行配置，每个OpType单独一行，dtype1，dtype2..需要与可设置计算精度的算子输入，算子输出的个数一一对应，且算子OpType必须为基于Ascend IR定义的算子的OpType，OpType可查阅《算子清单(https://www.hiascend.com/document/detail/zh/canncommercial/700/oplist/operatorlist/operatorlist\_0001.html)》。 对于同一个算子，如果同时配置了Opname和OpType的配置项，编译时以Opname的配置项为准。 使用该参数指定某个算子的计算精度时，如果模型转换过程中该算子被融合掉，则该算子指定的计算精度不生效。 |
| ACL\_OP\_PRECISION\_MODE | 设置算子精度模式的配置文件（.ini格式）路径以及文件名，路径和文件名：支持大小写字母（a\-z，A\-Z）、数字（0\-9）、下划线（\_）、中划线（\-）、句点（.）、中文字符. 配置文件中支持设置如下精度模式： high\_precision：表示高精度。 high\_performance：表示高性能。 support\_out\_of\_bound\_index：表示对gather、scatter和segment类算子的indices输入进行越界校验， 校验会降低算子的执行性能。 构造算子精度模式配置文件op\_precision.ini，并在该文件中按照算子类型、节点名称设置精度模式，每一行设置一个算子类型或节点名称的精度模式，按节点名称设置精度模式的优先级高于按算子类型。 配置样例如下： [ByOpType] optype1=high\_precision optype2=high\_performance optype3=support\_of\_bound\_index [ByNodeName] nodename1=high\_precision nodename2=high\_performance nodename3=support\_of\_bound\_index |
| ACL\_ALLOW\_HF32 | 当前版本不支持该参数。 算子内部计算时是否允许HF32类型替换FP32类型，true允许，false不允许，当前版本该配置仅针对Conv类算子与Matmul类算子生效。默认针对Conv类算子，启用FP32转换为HF32；默认针对Matmul类算子，关闭FP32转换为HF32。 HF32是昇腾推出的专门用于算子内部计算的单精度浮点类型，与其他常用数据类型的比较如下图所示。HF32与FP32支持相同的数值范围，但尾数位精度（11位）却接近FP16（10位）。通过降低精度让HF32单精度数据类型代替原有的FP32单精度数据类型，可大大降低数据所占空间大小，实现性能的提升。 Atlas 200/500 A2推理产品，不支持该配置。 说明： 配置为true时，哪些算子内部计算时允许HF32类型替换FP32类型，可在“CANN软件安装路径/opp/built\-in/op\_impl/ai\_core/tbe/impl\_mode/allow\_hf32\_matmul\_t\_conv\_t.ini”文件中查看； 配置为false时，哪些算子内部计算时不允许HF32类型替换FP32类型，可在“CANN软件安装路径/opp/built\-in/op\_impl/ai\_core/tbe/impl\_mode/allow\_hf32\_matmul\_f\_conv\_f.ini”文件中查看。 |
