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

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

7.3.1. 计算单元复制与内核SIMD向量化

大多数情况下,您应该先实现num_simd_work_items属性来提高数据处理的效率,然后才使用num_compute_units属性。

num_compute_units num_simd_work_items属性都通过增加 Intel® FPGA SDK for OpenCL™ Offline Compiler用于实现您内核的硬件数量来增加吞吐量。num_compute_units属性修改了可以调度到的计算单元的数量,这样也修改了内核访问全局存储器的次数。反之,则是num_simd_work_items属性修改了计算单元可以在单个工作组上并行执行的工作量。num_simd_work_items属性通过在每个SIMD矢量lane之间共享控制逻辑,来仅复制计算单元的数据路径。

通常,使用num_simd_work_items属性比使用num_compute_units属性可以更高效的实现同一目标。num_simd_work_items属性还使得离线编译器合并您的存储器访问。

图 77. 计算单元复制与内核SIMD向量化


多个计算单元争夺全局存储器可能会导致不希望出现的存储器访问模式。您可以引入num_simd_work_items属性来取代num_compute_units属性从而改变不希望出现的存储器访问模式。此外,num_simd_work_items属性提供的计算吞吐量可能与num_compute_units属性提供的内核计算单元复制等效。

在以下情况中,您无法是内核中实现num_simd_work_items属性:

  • 您对num_simd_work_items指定的值不是2、4、8或16。
  • reqd_work_group_size的值不能被num_simd_work_items整除。

    例如,以下声明不正确,因为50不能被4整除:

    __attribute__((num_simd_work_items(4)))
    __attribute__((reqd_work_group_size(50,0,0)))
  • 具有复杂控制流程的内核。您不能矢量化内核中的代码,其中不同的work-item遵循不同的控制路径(例如,控制路径取决于get_global_ID or get_local_ID)。

内核编译期间,离线编译器发布消息通知您矢量化优化是否成功实现。如果报告的矢量化因子与您对num_simd_work_items属性指定的值相匹配,则内核矢量化成功。