Intel® 高层次综合编译器专业版Pro版: 参考手册

ID 683349
日期 12/04/2023
Public
文档目录

A.3. 乔莱斯基分解(Cholesky Decomposition)库

Intel HLS Compiler附带的的Cholesky Decomposition库提供一个针对FPGA优化的模板化库,以用于将Hermitian(对称)正定矩阵分解为以下三角矩阵与共轭转置乘积.

头文件

要将Cholesky分解库包含到您的组件中,请将以下行添加到您的组件中:
#include ”HLS/cholesky_decompose.h”
头文件是自述文档(self-documented)。您可以查看头文件以了解如何使用Cholesky分解库。为了获得高性能,请在编译组件时使用
–ffp-reassociate命令标志。

变体

您可以调用四种不同的变体。所有变体都以ihc::cholesky命名空间命名。

Cholesky分解对矩阵进行大量迭代。为了获得最佳组件性能,组件需要低延迟访问矩阵迭代,并且矩阵必须矢量化。然而,该要求并不总是容易满足,因此两种变体允许您使用单独的存储器进行迭代分解并记录最终输出。

可用变体如下:

  • cholesky_decompose_real(A_input, L_iter, n);

    用于实值矩阵。

  • cholesky_decompose_real(A_input, L_output, L_iter, n);

    用于具有单独存储器的实值矩阵,以进行迭代分解和最终输出。

  • cholesky_decompose_complex(A_input, L_iter, n);

    用于复值(complex-valued)矩阵。

  • cholesky_decompose_complex(A_input, L_output, L_iter, n);

    用于具有单独存储器的复值矩阵,以进行迭代分解和最终输出。

参数

A_input

指向大小为MATRIX_SIZE * MATRIX_SIZE的数组的指针,用于提供输入A矩阵。

其数据宽度和对齐应与矩阵中单个单元的数据宽度和对齐相匹配。

L_iter

指向大小为MATRIX_SIZE * MATRIX_SIZE的数组的指针,用于保存程序可以迭代的L矩阵。

在3个参数的变体中,结果也都记录在此。其数据宽度和对齐方式应与矩阵中指定矢量化宽度的单元向量的宽度和对齐方式相匹配。

如果给定了指向组件内存的指针,则编译器应该能够自动进行优化。

L_output

指向大小为MATRIX_SIZE * MATRIX_SIZE的数组的指针,用于记录最终矩阵的4个参数变体的结果。

其数据宽度和对齐应与矩阵中单个单元的数据宽度和对齐相匹配。

n

实际矩阵大小。

该参数不应大于MATRIX_SIZE

模板参数

FP_T
浮点数据类型。可以是floatdouble
VEC_SIZE_PWR
矢量化宽度的对数(底为2)。矢量化宽度为 ,用于访问L_iter矩阵并进行点积计算。
此标头使用 Intel® HLS Compiler ivdep指令及其safelen()子句,插入与safelen()值匹配的虚拟迭代,以便更有效地管理存储器访问依赖性。
ivdep指令及其safelen()子句被用于Cholesky分解算法中的以下模板参数:
  • INNER_SAFELEN值应用到partial_dot数组,
  • OUTER_SAFELEN_OVERWRITE值应用于 L_iter矩阵
尽管提供了safelen()值的合理估值,但可能还需要针对不同的器件、时钟对象、精度和存储器安排对这些值进行一些调整。
使用迭代方法找到其最优值。首先,尝试较大的保守估计,直到编译结果不会显示任何“II”问题并给出令人满意的 fMAX。然后,使用Function Viewer(High-Level Design Reports的一部分)检查适用于safelen()值的存储器加载和存储节点的调度。加载和存储的启动周期的差异应该与该safelen()值的最佳使用值大致吻合。
INNER_SAFELEN
INNER_SAFELEN值适用于partial_dot数组。其值大致与算法中索引计算和浮点加法的延迟相匹配。safelen()值不会随矩阵大小而增长。默认给定值为16,该值应为单精度的理想值。对于双精度,请对其相应增加。
OUTER_SAFELEN_OVERWRITE
OUTER_SAFELEN_OVERWRITE值值适用于L_iter矩阵,并与列间依赖性相关。提供了safelen()值的估计值,以及该值随矩阵大小增长的估计值。但是,该模板参数的最佳值取决于时钟目标值、目标器件系列和所用精度。

使用此参数覆盖设置的safelen()值。

如果OUTER_SAFELEN_OVERWRITE=-1, 则将默认时钟对象的 Intel® Arria® 10器件上的safelen()值调整为单精度float数据类型。该调整还假设L_iter矩阵位于组件存储器中,并提供了适当的矢量化。