Intel® FPGA SDK for OpenCL™ Pro Edition: 最佳实践实践指南

ID 683521
日期 9/26/2022
Public
文档目录

4.3.1. 浮点与定点表示

FPGA包含大量用于实现浮点运算的逻辑。但是,您可以尽可能使用数据的定点表示来增加可用的硬件资源量。 实现定点运算所需的硬件通常比等效浮点运算的小。因此,您可以在FPGA中置入比等效浮点数更多的定点运算。

OpenCL®标准不支持定点表示;您必须使用整数数据类型实现定点表示。硬件开发人员通常使用定点数据表示来实现硬件节省,并且只保留执行计算所需的数据分辨率。您必须使用8,16,32或者64位标量数据类型,因为OpenCL标准仅支持这些数据分辨率。但是,您可以在源代码中加入适当的屏蔽(masking) 操作,以便硬件编译工具可以执行优化以节省硬件资源。

例如,如果算法使用了一个17位数据的定点表示,则必须使用32位数据类型来存储值。然后,如果您指示 Intel® FPGA SDK for OpenCL™ Offline Compiler将两个17位定点值相加,离线编译器必须创建额外的硬件来处理超出上层15个位的相加。为避免使用这些额外的硬件,您可以使用静态位掩码来指示硬件编译工具在硬件编译期间忽略不必要的位。以下代码实现该掩码操作:

__kernel fixed_point_add (__global const unsigned int * restrict a,
                          __global const unsigned int * restrict b,
                          __global unsigned int * restrict result)
{
	   size_t gid = get_global_id(0);

   	unsigned int temp;
   	temp = 0x3_FFFF & ((0x1_FFFF & a[gid]) + ((0x1_FFFF & b[gid]));

   	result[gid] = temp & 0x3_FFFF;
}

本代码实例中,输入ab的上层15个位被屏蔽并相加在一起。因为两个17位值相加的结果不能超出18位分辨率,所以离线编译器会应用一个其它掩码来屏蔽结果的上层14个位。最终的赢家实现是一个17位加法,而不是完整的32-bit加法。与FPGA中可用的硬件资源的绝对数量相比,本实例中节省的逻辑相对较小。然而,如果经常应用这些小额节省,则可以在整个FPGA中积累成更大的硬件节省。