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

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

7.4. 计算单元复制与内核SIMD矢量化合并

如果您的复制或矢量化OpenCL内核不适用于FPGA,则您可以通过复制计算单元或者矢量化内核来修改内核。 包含num_compute_units属性来修改内核的计算单元数量,并包含num_simd_work_items属性以利用内核矢量化。

考虑这样一种情况,其中内核的num_simd_work_items属性设置为16,不适用于FPGA。如果您复制一个较窄的SIMD内核计算单元来修改该内核,可能会使其适合FPGA。确定计算单元和SIMD宽度之间的最佳平衡可能需要进行一些实验。例如,复制四lane宽的SIMD内核计算单元三次,可能可以实现比复制1个八lane宽的SIMD内核计算单元两次获得更好的吞吐量。

以下实例代码显示如何合并OpenCL™代码中的num_compute_unitsnum_simd_work_items属性:

__attribute__((num_simd_work_items(4)))
__attribute__((num_compute_units(3)))
__attribute__((reqd_work_group_size(8,8,1)))
__kernel void matrixMult(__global float * restrict C,
                         __global float * restrict A,
. . .

下图说明如上所述的内核数据流。num_compute_units 实现3个复制的计算单元。num_simd_work_items实现四个SIMD矢量lane。

图 78. 通过合并计算单元复制和内核SIMD矢量化来优化吞吐量


注意: 您还可以使能资源驱动的优化器来自动确定num_compute_unitsnum_simd_work_items的最佳组合。
重要: 对填充整个FPGA的硬件设计进行编译比较小的设计更耗时。调整您的内核优化时,请删除重新编译内核之前,先删除增加的SIMD矢量lane数量和计算单元数量。