ZHCUAQ1F july 2015 – april 2023
通过使用 C6000 分析工具,您可以识别代码中需要重写为线性汇编语言的时间关键段。为汇编优化器编写的源代码与汇编源代码类似。但是,线性汇编代码不需要进行分区、调度或寄存器分配。目的是让汇编优化器为您确定此信息。当您编写线性汇编代码时,您需要了解以下各项:
您的线性汇编文件可以是线性汇编代码段和常规汇编源的组合。使用汇编优化器指令将汇编优化器代码与常规汇编代码区分开来,并向汇编优化器提供有关代码的其他信息。节 5.4 中介绍了汇编优化器指令。
表 5-1 中的编译器选项会影响汇编优化器的行为。
选项 | 效果 | 请参阅 |
---|---|---|
--ap_extension | 更改汇编优化器源文件的默认扩展名 | 节 3.3.10 |
--ap_file | 更改汇编优化器源文件的标识方式 | 节 3.3.8 |
--disable_software_pipelining | 关闭软件流水线 | 节 4.6.1 |
--debug_software_pipeline | 生成详细的软件流水线信息 | 节 4.6.2 |
--interrupt_threshold=n | 指定中断阈值 | 节 3.12 |
--keep_asm | 保留汇编语言 (.asm) 文件 | 节 3.3.2 |
--no_bad_aliases | 假设没有存储器别名使用 | 节 4.12.3 |
--opt_for_space=n | 在四个级别(n=0、1、2 或 3)上控制代码大小 | 节 4.9 |
--opt_level=n | 提高优化级别(n=0、1、2 或 3) | 节 4.1 |
--quiet | 抑制进度消息 | 节 3.3.2 |
--silicon_version=n | 选择目标版本 | 节 3.3.5 |
--skip_assembler | 仅编译或汇编优化(不汇编) | 节 3.3.2 |
--speculate_loads=n | 允许对具有分界地址范围的加载进行推测执行 | 节 4.6.3 |
当您编写线性汇编代码时,您的代码不 需要指示以下内容:
与其他代码生成工具一样,您可能需要修改线性汇编代码,直到对其性能感到满意。如果这样做,您可能需要为线性汇编添加更多细节。例如,您可能需要对某些寄存器进行分区或分配。
汇编优化器假定输入文件中的指令按照您希望它们发生的逻辑顺序(即线性汇编代码)放置。并行指令是非法的。
如果编译器无法使您的指令呈线性(非并行),则会生成错误消息。编译器假定指令按照其在文件中出现的顺序发生。已调度代码是非法的(即使是非并行调度代码)。编译器可能不会检测到已调度代码,但产生的输出可能不是您想要的。
线性汇编源程序包含源语句,这些源语句可以包含汇编优化器指令、汇编语言指令和注释。更多有关源语句元素的信息,请参阅节 5.3.1。
寄存器可以显式分配给用户符号。或者,可以将符号分配给 A 侧或 B 侧,让编译器执行实际的寄存器分配。有关指定寄存器的信息,请参阅节 5.3.2。
功能单元说明符在线性汇编代码中是可选的。数据路径信息会予以考虑;单元信息会被忽略。
汇编优化器会将输入线性汇编指令的注释附加到输出文件中。它会将一个二元组 <x, y> 附加到注释,从而规定指令在软件流水线上执行的循环的迭代和周期。从零开始的数字 x 表示在内核第一次执行期间指令所进行的迭代。从零开始的数字 y 表示在循环的单次迭代中进行指令调度的周期。有关使用源代码注释和生成的汇编优化器输出的说明,请参阅节 5.3.4。